Namespaces
Variants

std:: next

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 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;
}
**Перевод комментария:** `// since C++17` → `// начиная с C++17` Остальной код C++ не переведён в соответствии с требованиями, так как находится внутри тегов `
` и содержит C++ специфические термины. HTML структура и форматирование полностью сохранены.

Примечания

Хотя выражение ++ 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 Applied to Behavior as published Correct behavior
LWG 2353 C++11 next required LegacyForwardIterator LegacyInputIterator allowed

Смотрите также

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