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) | (説明用*) |
| Helper function templates |
||
| template< /*cartesian-product-common-arg*/ R > constexpr auto /*cartesian-common-arg-end*/( R& r ) |
(9) | (説明用*) |
cartesian_product_viewは、n個のview(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に渡されるFirstrangeは、一度しか渡されないため特別に扱われます。その結果、いくつかの制約が緩和されます。
-
Firstはforward_rangeではなくinput_rangeです。 -
cartesian_product_viewがrandom_access_rangeまたはcommon_rangeであるために、Firstはsized_rangeである必要はありません。 -
cartesian_product_viewがbidirectional_rangeであるために、Firstはcommon_rangeである必要はありません。
目次 |
カスタマイゼーションポイントオブジェクト
views::cartesian_productという名前は、const 関数オブジェクトであり、リテラル semiregular クラス型であるカスタマイゼーションポイントオブジェクトを示します。説明のために、その型のcv非限定バージョンは__cartesian_product_fnと表記されます。
__cartesian_product_fn のすべてのインスタンスは等価です。同じ引数に対して型 __cartesian_product_fn の異なるインスタンスを呼び出す効果は、そのインスタンスを示す式がlvalueかrvalueか、const修飾されているかどうかにかかわらず、等価です(ただし、volatile修飾されたインスタンスは呼び出し可能である必要はありません)。したがって、views::cartesian_product は自由にコピーでき、そのコピーは互換的に使用できます。
一連の型 Args... が与えられた場合、std::declval<Args>()... が上記の views::cartesian_product の引数要件を満たす場合、__cartesian_product_fn は以下をモデル化します。
- std::invocable<__cartesian_product_fn, Args...>,
- std::invocable<const __cartesian_product_fn, Args...>,
- std::invocable<__cartesian_product_fn&, Args...>, および
- std::invocable<const __cartesian_product_fn&, Args...>.
それ以外の場合、__cartesian_product_fn の関数呼び出し演算子はオーバーロード解決に参加しません。
[編集] データメンバー
| メンバ | 定義 |
std::tuple<First, Vs...> base_ (private) |
適合されたすべてのviewオブジェクトを保持するオブジェクト。(説明用のメンバオブジェクト*) |
[編集] メンバ関数
cartesian_product_viewを構築する(public メンバ関数) | |
| 先頭へのイテレータを返す (public メンバ関数) | |
| 終端へのイテレータまたはセンチネルを返す (public メンバ関数) | |
基底(アダプトされた)レンジが sized_range を満たす場合にのみ、要素数を返す(public メンバ関数) | |
std::ranges::view_interface から継承 | |
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される( std::ranges::view_interface<D> の public メンバ関数) | |
| (C++23) |
範囲の先頭への定数イテレータを返す ( std::ranges::view_interface<D> の public メンバ関数) |
| (C++23) |
範囲の定数イテレータの番兵を返す ( std::ranges::view_interface<D> の public メンバ関数) |
| 派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される ( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが bidirectional_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
[編集] 推論ガイド
[編集] ネストされたクラス
| イテレータ型 (説明専用メンバクラステンプレート*) |
[編集] 備考
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__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 Cartesian product view [range.stride]
[編集] 関連項目
| (C++23) |
適合するviewの対応する要素への参照のタプルからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |