名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
cartesian_product_viewviews::cartesian_product
(C++23)(C++23)

 
 
ヘッダ <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) (説明用*)
Helper function templates
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個のviewn > 0)を受け取り、提供された範囲のn項カルテシアン積によって計算されたタプルのviewを生成するレンジアダプターです。生成されるビューのサイズは、提供された範囲のサイズの積であり、各要素はサイズnのタプル(参照の)です。
2) views::cartesian_productはカスタマイゼーションポイントオブジェクトです。
3) cartesian_productがランダムアクセス範囲であるかを決定します(random_access_rangeも参照)。
4) cartesian_productが共通範囲であるかを決定します(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に渡されるFirstrangeは、一度しか渡されないため特別に扱われます。その結果、いくつかの制約が緩和されます。

目次

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

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 は以下をモデル化します。

それ以外の場合、__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_rangecommon_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]

[編集] 関連項目

適合するviewの対応する要素への参照のタプルからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)