Namespaces
Variants

std::ranges:: views:: cartesian_product, std::ranges:: cartesian_product_view

From cppreference.net
Ranges library
Range adaptors
cartesian_product_view views::cartesian_product
(C++23) (C++23)

(注:指定されたHTML要素には翻訳対象のテキストが含まれていないため、元の構造をそのまま保持します)
定義済みヘッダー <ranges>
template < ranges:: input_range First, ranges:: forward_range ... Vs >

requires ( ranges:: view < First > && ... && ranges:: view < Vs > )
class cartesian_product_view

: public ranges:: view_interface < cartesian_product_view < First, Vs... >>
(1) (C++23以降)
namespace views {

inline constexpr /*unspecified*/ cartesian_product = /*unspecified*/ ;

}
(2) (C++23以降)
呼び出しシグネチャ
template < ranges:: viewable_range ... Rs >

requires /* 下記参照 */

constexpr ranges:: view auto cartesian_product ( Rs && ... rs ) ;
(C++23以降)
ヘルパーコンセプト
template < bool Const, class First, class ... Vs >

concept /*cartesian-product-is-random-access*/ =
( ranges:: random_access_range < /*maybe-const*/ < Const, First >> && ... &&
( ranges:: random_access_range < /*maybe-const*/ < Const, Vs >> &&

ranges:: sized_range < /*maybe-const*/ < Const, Vs >> ) ) ;
(3) ( 説明専用* )
template < class R >

concept /*cartesian-product-common-arg*/ =
ranges:: common_range < R > ||

( ranges:: sized_range < R > && ranges:: random_access_range < R > ) ;
(4) ( 説明専用* )
template < bool Const, class First, class ... Vs >

concept /*cartesian-product-is-bidirectional*/ =
( ranges:: bidirectional_range < /*maybe-const*/ < Const, First >> && ... &&
( ranges:: bidirectional_range < /*maybe-const*/ < Const, Vs >> &&

/*cartesian-product-common-arg*/ < /*maybe-const*/ < Const, Vs >> ) ) ;
(5) ( 説明専用* )
template < class First, class ... Vs >

concept /*cartesian-product-is-common*/ =

/*cartesian-product-common-arg*/ < First > ;
(6) ( 説明専用* )
template < class ... Vs >

concept /*cartesian-product-is-sized*/ =

( ranges:: sized_range < Vs > && ... ) ;
(7) ( 説明専用* )
template < bool Const, template < class > class FirstSent, class First, class ... Vs >

concept /*cartesian-is-sized-sentinel*/ =
( std:: sized_sentinel_for < FirstSent < /*maybe-const*/ < Const, First >> ,
ranges:: iterator_t < /*maybe-const*/ < Const, First >>> && ... &&
( ranges:: sized_range < /*maybe-const*/ < Const, Vs >> &&
std:: sized_sentinel_for < ranges:: iterator_t <
/*maybe-const*/ < Const, Vs >> ,

ranges:: iterator_t < /*maybe-const*/ < Const, Vs >>> ) ) ;
(8) ( 説明専用* )
ヘルパー関数テンプレート
template < /*cartesian-product-common-arg*/ R >

constexpr auto /*cartesian-common-arg-end*/ ( R & r )
{
if constexpr ( ranges:: common_range < R > )
return ranges:: end ( r ) ;
else
return ranges:: begin ( r ) + ranges:: distance ( r ) ;

}
(9) ( 説明専用* )
1) cartesian_product_view は、 n 個の view s n > 0 )を受け取り、提供された範囲の n項デカルト積 によって計算されたタプルの view を生成する範囲アダプタです。生成されるビューのサイズは提供された範囲のサイズの積であり、各要素はサイズ n の(参照の)タプルです。
2) views::cartesian_product はカスタマイゼーションポイントオブジェクトです。
  • 引数なしで呼び出した場合、 views :: cartesian_product ( ) 式等価 views:: single ( std:: tuple ( ) ) となります。
  • それ以外の場合、 views :: cartesian_product ( rs... ) 式等価 ranges :: cartesian_product_view < views:: all_t < decltype ( ( rs ) ) > ... > ( rs... ) となります。
3) cartesian_product がランダムアクセス範囲であるかどうかを判定する(参照: random_access_range )。
4) cartesian_product が共通範囲(common range)であるかどうかを判定します( common_range も参照)。
5) cartesian_product が双方向範囲であるかどうかを判定する(参照: bidirectional_range )。
6) cartesian_product がヘルパーコンセプト /*cartesian-product-is-common*/ を満たすかどうかを判定する( common_range も参照)。
7) cartesian_product がサイズ指定範囲であるかどうかを判定する(関連項目: sized_range )。
8) cartesian_product がサイズ指定されたセンチネルを使用するかどうかを判定します。
9) 生成された view の終端を返す。 cartesian_product がヘルパーコンセプト /*cartesian-product-common-arg*/ を満たす場合にのみ、オーバーロード解決に参加する。

cartesian_product_view に渡される range のうち First は特別に扱われ、一度だけ通過されるため、いくつかの制約が緩和されます:

目次

カスタマイゼーションポイントオブジェクト

views::cartesian_product という名前は カスタマイゼーションポイントオブジェクト を表します。これは 関数オブジェクト の const な リテラル semiregular クラス型です。詳細については CustomizationPointObject を参照してください。

データメンバ

メンバー 定義
std:: tuple < First, Vs... > base_ (非公開) すべての適応された view オブジェクトを保持するオブジェクト。
説明専用メンバーオブジェクト*

メンバー関数

cartesian_product_view を構築する
(public member function)
先頭を指すイテレータを返す
(public member function)
終端を指すイテレータまたはセンチネルを返す
(public member function)
要素数を返す(基となる(アダプトされた)レンジが sized_range を満たす場合のみ提供)
(public member function)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す( sized_range または forward_range を満たす場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)
(C++23)
レンジの先頭を指す定数イテレータを返す
( std::ranges::view_interface<D> のpublic member function)
(C++23)
レンジの定数イテレータ用センチネルを返す
( std::ranges::view_interface<D> のpublic member function)
派生ビューが空でないかどうかを返す( ranges::empty が適用可能な場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの先頭要素を返す( forward_range を満たす場合に提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの末尾要素を返す( bidirectional_range かつ common_range を満たす場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの n 番目 の要素を返す( random_access_range を満たす場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)

推論ガイド

ネストされたクラス

イテレータ型
( 説明専用メンバクラステンプレート* )

注記

機能テスト マクロ 標準 機能
__cpp_lib_ranges_cartesian_product 202207L (C++23) std::ranges::cartesian_product_view

#include <array>
#include <iostream>
#include <list>
#include <ranges>
#include <string>
#include <vector>
void print(std::tuple<char const&, int const&, std::string const&> t, int pos)
{
    const auto& [a, b, c] = t;
    std::cout << '(' << a << ' ' << b << ' ' << c << ')' << (pos % 4 ? " " : "\n");
}
int main()
{
    const auto x = std::array{'A', 'B'};
    const auto y = std::vector{1, 2, 3};
    const auto z = std::list<std::string>{"α", "β", "γ", "δ"};
    for (int i{1}; auto const& tuple : std::views::cartesian_product(x, y, z))
        print(tuple, i++);
}

出力:

(A 1 α) (A 1 β) (A 1 γ) (A 1 δ)
(A 2 α) (A 2 β) (A 2 γ) (A 2 δ)
(A 3 α) (A 3 β) (A 3 γ) (A 3 δ)
(B 1 α) (B 1 β) (B 1 γ) (B 1 δ)
(B 2 α) (B 2 β) (B 2 γ) (B 2 δ)
(B 3 α) (B 3 β) (B 3 γ) (B 3 δ)

参考文献

  • C++23標準 (ISO/IEC 14882:2024):
  • 26.7.31 直積ビュー [range.stride]

関連項目

アダプトされたビューの対応する要素への参照のタプルから構成される view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)