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

(注:原文のテキストコンテンツが存在しないため、翻訳対象となるテキストはありません。HTML構造はそのまま保持されています。)

目次

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 ;
(C++23以降)
( 説明専用* )

2つの イテレータ 間の「距離」(すなわち「ホップ数」)を返します。

以下を定義する:

  • 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*/ を全ての整数 0 ≤ N ≤ sizeof... ( Vs ) に対する /*scaled-distance*/ ( N ) の和とする

戻り値: /*scaled-sum*/

/*scaled-sum*/ difference_type で表現できない場合、動作は未定義です。

以下の関数で使用される:

パラメータ

t - 距離を求める対象のイテレータのタプル