Spec-Zone.ru › C++

std::next

Определён в заголовке <iterator>
template< class InputIt >
InputIt next( InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1 );
(начиная с C++11)
(до C++17)
template< class InputIt >
constexpr
InputIt next( InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1 );
(начиная с C++17)

Возвращает итератор, следующий через n позиций (или предшествующий на -n позиций, если n отрицательно) относительно итератора it.

Параметры

it - итератор
n - число элементов для продвижения
Требования к типам
-InputIt должен соответствовать требованиям LegacyInputIterator.

Возвращаемое значение

Итератор типа InputIt, следующий через n позиций (или предшествующий на -n позиций, если n отрицательно) относительно итератора it.

Сложность

Линейная.

Однако если InputIt также соответствует требованиям LegacyRandomAccessIterator, сложность постоянная.

Возможная реализация

template<class InputIt>
constexpr // since C++17
InputIt next(InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1)
{
    std::advance(it, n);
    return it;
}

Примечания

Хотя выражение ++c.begin() часто компилируется, это не гарантируется: c.begin() является rvalue-выражением, а требования LegacyInputIterator не гарантируют возможность инкремента rvalue. В частности, если итераторы реализованы как указатели или их operator++ имеет квалификатор lvalue-ref, ++c.begin() не компилируется, тогда как std::next(c.begin()) компилируется.

Пример

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> v{4, 5, 6};

    auto it = v.begin();
    auto nx = std::next(it, 2);
    std::cout << *it << ' ' << *nx << '\n';

    it = v.end();
    nx = std::next(it, -2);
    std::cout << ' ' << *nx << '\n';
}

Вывод:

4 6
 5

Отчёты об исправлениях ошибок

Следующие отчёты об исправлениях ошибок, меняющих поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применён к Поведение согласно опубликованной версии Исправленное поведение
LWG 2353 C++11 next требовался LegacyForwardIterator допускается LegacyInputIterator

См. также

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

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

Spec-Zone.ru

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