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() является rvalue-выражением, и требования к итераторам не гарантируют, что уменьшение rvalue будет работать. В частности, если итераторы реализованы как указатели или для их operator-- задана lvalue-ref-квалификация, --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) | уменьшает итератор на заданное расстояние или перемещает его к границе (объект-функция алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/prev