Spec-Zone.ru › C++

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

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>();
    }
}

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

  • ranges::cartesian_product_view::operator+

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;

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

  • ranges::cartesian_product_view::operator-

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

template< class Tuple >
constexpr difference_type
    /*distance-from*/( const Tuple& t ) const;
(с 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.

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

  • operator-(const/*iterator*/&,const/*iterator*/&)
  • operator-(const/*iterator*/&,std::default_sentinel_t)

Параметры

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/cartesian_product_view/iterator/helpers

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API