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
|
(начиная с 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++ специфические термины. 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)
|
уменьшает итератор
(шаблон функции) |
|
перемещает итератор на заданное расстояние
(шаблон функции) |
|
|
возвращает расстояние между двумя итераторами
(шаблон функции) |
|
|
(C++20)
|
увеличивает итератор на заданное расстояние или до границы
(функциональный объект алгоритма) |