Namespaces
Variants

std::ranges:: 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 < 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 на который указывает

Возвращаемое значение

1) Преемник итератора i .
2) n преемник итератора i .
3) Первый итератор, эквивалентный bound .
4) n -й преемник итератора i , или первый итератор, эквивалентный bound , в зависимости от того, что наступит раньше.

Сложность

1) Константа.
2) Константная, если I моделирует std::random_access_iterator ; в противном случае линейная.
3) Константная, если I и S моделируют оба std:: random_access_iterator < I > и std:: sized_sentinel_for < S, I > , или если I и S моделируют std:: assignable_from < I & , S > ; в противном случае линейная.
4) Константная, если 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++11)
увеличивает итератор
(шаблон функции)