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 |
См. также
|
(C++11) | уменьшает значение итератора (шаблон функции) |
| перемещает итератор на заданное расстояние (шаблон функции) |
|
| возвращает расстояние между двумя итераторами (шаблон функции) |
|
|
(C++20) | увеличивает значение итератора на заданное расстояние или перемещает его до заданной границы (объект-функция алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/next