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) |
инкрементирует итератор на заданное расстояние или до границы (niebloid) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/next