名稱空間
變體
操作

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

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
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 起)
呼叫簽名 (Call signature)
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 是一個範圍介面卡,它接受 nview,其中 n > 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 範圍(另請參閱 sized_range)。
8) 確定 cartesian_product 是否使用 sized 哨兵。
9) 返回生成的 view 的末尾。僅當 cartesian_product 滿足輔助概念 /*cartesian-product-common-arg*/ 時才參與過載決議。

傳遞給 cartesian_product_viewFirst range 被特殊處理,因為它只遍歷一次。因此,對其進行了一些限制放寬:

目錄

自定義點物件

名稱 views::cartesian_product 表示一個 *定製點物件*,它是一個 const 函式物件,其型別是 字面量 semiregular 類型別。為便於說明,其 cv-unqualified 版本型別表示為 __cartesian_product_fn

__cartesian_product_fn 的所有例項都相等。無論表示例項的表示式是左值還是右值,以及是否為 const-qualified(但是,volatile-qualified 例項不要求可呼叫),呼叫不同型別為 __cartesian_product_fn 例項對相同引數的效果都是等價的。因此,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
(公共成員函式) [編輯]
返回指向起始的迭代器
(公共成員函式) [編輯]
返回一個迭代器或一個哨兵到末尾
(公共成員函式) [編輯]
返回元素數量,僅當底層(適配的)範圍滿足 sized_range 時提供
(公共成員函式) [編輯]
繼承自 std::ranges::view_interface
返回派生檢視是否為空,僅當其滿足 sized_rangeforward_range 時才提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視是否非空,僅當 ranges::empty 適用於它時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第一個元素,如果它滿足 forward_range 則提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的最後一個元素,僅當其滿足 bidirectional_rangecommon_range 時才提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第 n 個元素,僅當它滿足 random_access_range 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]

[編輯] 推導指南

[編輯] 巢狀類

迭代器型別
(僅用於說明的成員類模板*)

[編輯] 註解

特性測試 標準 特性
__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,由適配檢視中相應元素的引用元組組成
(類模板) (定製點物件)[編輯]