Spec-Zone.ru › C++

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

См. также

next
(C++11)
увеличивает итератор
(шаблон функции)
advance
перемещает итератор на заданное расстояние
(шаблон функции)
distance
возвращает расстояние между двумя итераторами
(шаблон функции)
ranges::prev
(C++20)
уменьшает итератор на заданное расстояние или перемещает его к границе
(объект-функция алгоритма)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/prev

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API