std::ranges:: next
|
Определено в заголовке
<iterator>
|
||
|
Сигнатура вызова
|
||
|
template
<
std::
input_or_output_iterator
I
>
constexpr I next ( I i ) ; |
(1) | (начиная с C++20) |
|
template
<
std::
input_or_output_iterator
I
>
constexpr I next ( I i, std:: iter_difference_t < I > n ) ; |
(2) | (начиная с C++20) |
|
template
<
std::
input_or_output_iterator
I,
std::
sentinel_for
<
I
>
S
>
constexpr I next ( I i, S bound ) ; |
(3) | (начиная с C++20) |
|
template
<
std::
input_or_output_iterator
I,
std::
sentinel_for
<
I
>
S
>
constexpr I next ( I i, std:: iter_difference_t < I > n, S bound ) ; |
(4) | (начиная с C++20) |
Возвращает n -й преемник итератора i .
Описываемые на этой странице функциональные сущности являются algorithm function objects (неформально известными как niebloids ), то есть:
- Явные списки аргументов шаблона не могут быть указаны при вызове любого из них.
- Ни один из них не видим для argument-dependent lookup .
- Когда любой из них найден с помощью normal unqualified lookup как имя слева от оператора вызова функции, argument-dependent lookup блокируется.
Содержание |
Параметры
| i | - | итератор |
| n | - | количество элементов для продвижения |
| bound | - | ограничитель, обозначающий конец диапазона, i на который указывает |
Возвращаемое значение
Сложность
I
и
S
моделируют оба
std::
random_access_iterator
<
I
>
и
std::
sized_sentinel_for
<
S, I
>
, или если
I
и
S
моделируют
std::
assignable_from
<
I
&
, S
>
; в противном случае линейная.
I
и
S
моделируют оба
std::
random_access_iterator
<
I
>
и
std::
sized_sentinel_for
<
S, I
>
; в противном случае линейная.
Возможная реализация
struct next_fn { template<std::input_or_output_iterator I> constexpr I operator()(I i) const { ++i; return i; } template<std::input_or_output_iterator I> constexpr I operator()(I i, std::iter_difference_t<I> n) const { ranges::advance(i, n); return i; } template<std::input_or_output_iterator I, std::sentinel_for<I> S> constexpr I operator()(I i, S bound) const { ranges::advance(i, bound); return i; } template<std::input_or_output_iterator I, std::sentinel_for<I> S> constexpr I operator()(I i, std::iter_difference_t<I> n, S bound) const { ranges::advance(i, n, bound); return i; } }; inline constexpr auto next = next_fn(); |
Примечания
Хотя выражение
++
x.
begin
(
)
часто компилируется, это не гарантировано:
x.
begin
(
)
является rvalue-выражением, и нет требований, гарантирующих работоспособность инкремента rvalue. В частности, когда итераторы реализованы как указатели или их
operator++
имеет lvalue-ref-квалификатор,
++
x.
begin
(
)
не компилируется, тогда как
ranges
::
next
(
x.
begin
(
)
)
компилируется.
Пример
#include <cassert> #include <iterator> int main() { auto v = {3, 1, 4}; { auto n = std::ranges::next(v.begin()); assert(*n == 1); } { auto n = std::ranges::next(v.begin(), 2); assert(*n == 4); } { auto n = std::ranges::next(v.begin(), v.end()); assert(n == v.end()); } { auto n = std::ranges::next(v.begin(), 42, v.end()); assert(n == v.end()); } }
Смотрите также
|
(C++20)
|
уменьшает итератор на заданное расстояние или до границы
(функциональный объект алгоритма) |
|
(C++20)
|
перемещает итератор на заданное расстояние или до заданной границы
(функциональный объект алгоритма) |
|
(C++11)
|
увеличивает итератор
(шаблон функции) |