Namespaces
Variants

std:: prev

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
Определено в заголовочном файле <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 // начиная с 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)
увеличивает итератор
(шаблон функции)
перемещает итератор на заданное расстояние
(шаблон функции)
возвращает расстояние между двумя итераторами
(шаблон функции)
уменьшает итератор на заданное расстояние или до границы
(функциональный объект алгоритма)