std::prev
Определено в заголовке <iterator> |
||
|---|---|---|
template< class BidirIt > BidirIt prev( BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1 ); |
(с C++11) (до C++17) |
|
template< class BidirIt > constexpr BidirIt prev( BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1 ); |
(с C++17) |
Возвращает n-й предшественник (или -n-й преемник, если n отрицательное) итератора it.
Параметры
| it | - | итератор |
| n | - | число элементов, на которое it нужно спуститься |
| Требования к типу | ||
-BidirIt должен соответствовать требованиям LegacyBidirectionalIterator. |
||
Возвращаемое значение
Итератор типа BidirIt, содержащий n-й предшественник (или -n-й преемник, если n отрицательное) итератора it.
Сложность
Линейная.
Однако, если BidirIt дополнительно соответствует требованиям LegacyRandomAccessIterator, сложность является постоянной.
Возможная реализация
template<class BidirIt>
constexpr // since C++17
BidirIt prev(BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1)
{
std::advance(it, -n);
return it;
} |
Примечания
Хотя выражение --c.end() часто компилируется, это не гарантируется: c.end() является выражением-значением, и нет требования к итераторам, указывающего, что декремент выражения-значения гарантированно работает. В частности, когда итераторы реализованы как указатели или их operator-- имеет квалификатор lvalue-ссылка, --c.end() не компилируется, в то время как std::prev(c.end()) компилируется.
Пример
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v{3, 1, 4};
auto it = v.end();
auto pv = std::prev(it, 2);
std::cout << *pv << '\n';
it = v.begin();
pv = std::prev(it, -2);
std::cout << *pv << '\n';
}Вывод:
1 4
См. также
|
(C++11) |
инкрементирование итератора (шаблон функции) |
| продвигает итератор на заданное расстояние (шаблон функции) |
|
| возвращает расстояние между двумя итераторами (шаблон функции) |
|
|
(C++20) |
декрементирование итератора на заданное расстояние или до границы (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/prev