Namespaces
Variants

std::ranges::cartesian_product_view<First, Vs...>:: iterator <Const>:: next , std::ranges::cartesian_product_view<First, Vs...>:: iterator <Const>:: prev , std::ranges::cartesian_product_view<First, Vs...>:: iterator <Const>:: distance_from

From cppreference.net
Ranges library
Range adaptors

Содержание

std::ranges::cartesian_product_view:: iterator :: next

template < std:: size_t N = sizeof... ( Vs ) >
constexpr void /*next*/ ( ) ;
(начиная с C++23)
( только для демонстрации* )

При вызове с параметром шаблона по умолчанию рекурсивно генерирует следующий элемент (кортеж итераторов) в cartesian_product_view .

Пусть current_ обозначает базовый кортеж итераторов. Эквивалентно:

auto& it = std::get<N>(current_);
++it;
if constexpr (N > 0)
{
    if (it == ranges::end(std::get<N>(parent_->bases_)))
    {
        it = ranges::begin(std::get<N>(parent_->bases_));
        next<N - 1>();
    }
}

Используется в следующих нестатических функциях-членах:

std::ranges::cartesian_product_view:: iterator :: prev

template < std:: size_t N = sizeof... ( Vs ) >
constexpr void /*prev*/ ( ) ;
(начиная с C++23)
( только для демонстрации* )

При вызове с параметром шаблона по умолчанию рекурсивно генерирует предыдущий элемент (кортеж итераторов) в cartesian_product_view .

Пусть current_ обозначает базовый кортеж итераторов. Эквивалентно:

auto& it = std::get<N>(current_);
if constexpr (N > 0)
{
    if (it == ranges::begin(std::get<N>(parent_->bases_)))
    {
        it = /*cartesian-common-arg-end*/(std::get<N>(parent_->bases_));
        prev<N - 1>();
    }
}
--it;

Используется в следующих нестатических функциях-членах:

std::ranges::cartesian_product_view:: iterator :: distance_from

template < class Tuple >

constexpr difference_type

/*distance-from*/ ( const Tuple & t ) const ;
(since C++23)
( только для демонстрации* )

Возвращает "расстояние" (т.е. количество "переходов") между двумя итераторами .

Пусть:

  • parent_ будет указателем на базовый cartesian_product_view
  • /*scaled-size*/ ( N ) будет:
    • произведением static_cast < difference_type > ( ranges:: size ( std :: get < N > ( parent_ - > bases_ ) ) ) и /*scaled-size*/ ( N + 1 ) если N ≤ sizeof... ( Vs ) , иначе
    • static_cast < difference_type > ( 1 ) ;
  • /*scaled-distance*/ ( N ) будет произведением static_cast < difference_type > ( std :: get < N > ( current_ ) - std :: get < N > ( t ) ) и /*scaled-size*/ ( N + 1 ) ;
  • /*scaled-sum*/ будет суммой /*scaled-distance*/ ( N ) для каждого целого числа 0 ≤ N ≤ sizeof... ( Vs ) .

Возвращает: /*scaled-sum*/ .

Поведение не определено, если /*scaled-sum*/ не может быть представлено типом difference_type .

Используется в следующих функциях:

Параметры

t - кортеж итераторов, до которых нужно найти расстояние