std::ranges:: views:: cartesian_product, std::ranges:: cartesian_product_view
|
定義済みヘッダー
<ranges>
|
||
|
template
<
ranges::
input_range
First,
ranges::
forward_range
...
Vs
>
requires
(
ranges::
view
<
First
>
&&
...
&&
ranges::
view
<
Vs
>
)
|
(1) | (C++23以降) |
|
namespace
views
{
inline
constexpr
/*unspecified*/
cartesian_product
=
/*unspecified*/
;
|
(2) | (C++23以降) |
|
呼び出しシグネチャ
|
||
|
template
<
ranges::
viewable_range
...
Rs
>
requires
/* 下記参照 */
|
(C++23以降) | |
|
ヘルパーコンセプト
|
||
|
template
<
bool
Const,
class
First,
class
...
Vs
>
concept
/*cartesian-product-is-random-access*/
=
|
(3) | ( 説明専用* ) |
|
template
<
class
R
>
concept
/*cartesian-product-common-arg*/
=
|
(4) | ( 説明専用* ) |
|
template
<
bool
Const,
class
First,
class
...
Vs
>
concept
/*cartesian-product-is-bidirectional*/
=
|
(5) | ( 説明専用* ) |
|
template
<
class
First,
class
...
Vs
>
concept
/*cartesian-product-is-common*/
=
|
(6) | ( 説明専用* ) |
|
template
<
class
...
Vs
>
concept
/*cartesian-product-is-sized*/
=
|
(7) | ( 説明専用* ) |
|
template
<
bool
Const,
template
<
class
>
class
FirstSent,
class
First,
class
...
Vs
>
concept
/*cartesian-is-sized-sentinel*/
=
|
(8) | ( 説明専用* ) |
|
ヘルパー関数テンプレート
|
||
|
template
<
/*cartesian-product-common-arg*/
R
>
constexpr
auto
/*cartesian-common-arg-end*/
(
R
&
r
)
|
(9) | ( 説明専用* ) |
cartesian_product_view
は、
n
個の
view
s
(
n > 0
)を受け取り、提供された範囲の
n項デカルト積
によって計算されたタプルの
view
を生成する範囲アダプタです。生成されるビューのサイズは提供された範囲のサイズの積であり、各要素はサイズ
n
の(参照の)タプルです。
views::cartesian_product
はカスタマイゼーションポイントオブジェクトです。
- 引数なしで呼び出した場合、 views :: cartesian_product ( ) は 式等価 で views:: single ( std:: tuple ( ) ) となります。
- それ以外の場合、 views :: cartesian_product ( rs... ) は 式等価 で ranges :: cartesian_product_view < views:: all_t < decltype ( ( rs ) ) > ... > ( rs... ) となります。
cartesian_product
がサイズ指定されたセンチネルを使用するかどうかを判定します。
view
の終端を返す。
cartesian_product
がヘルパーコンセプト
/*cartesian-product-common-arg*/
を満たす場合にのみ、オーバーロード解決に参加する。
cartesian_product_view
に渡される
range
のうち
First
は特別に扱われ、一度だけ通過されるため、いくつかの制約が緩和されます:
-
Firstはinput_rangeであり、forward_rangeではない; -
Firstがsized_rangeである必要はなく、cartesian_product_viewがrandom_access_rangeまたはcommon_rangeとなる; -
Firstがcommon_rangeである必要はなく、cartesian_product_viewがbidirectional_rangeとなる。
目次 |
カスタマイゼーションポイントオブジェクト
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]
関連項目
|
(C++23)
|
アダプトされたビューの対応する要素への参照のタプルから構成される
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |