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 起) |
呼叫簽名 (Call signature) |
||
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
,其中 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
是否使用 sized 哨兵。傳遞給 cartesian_product_view
的 First
range
被特殊處理,因為它只遍歷一次。因此,對其進行了一些限制放寬:
-
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
類型別。為便於說明,其 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
遵循
- 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 (公共成員函式) | |
返回指向起始的迭代器 (公共成員函式) | |
返回一個迭代器或一個哨兵到末尾 (公共成員函式) | |
返回元素數量,僅當底層(適配的)範圍滿足 sized_range 時提供(公共成員函式) | |
繼承自 std::ranges::view_interface | |
返回派生檢視是否為空,僅當其滿足 sized_range 或 forward_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_range 和 common_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]
[編輯] 另請參閱
(C++23) |
一個 view ,由適配檢視中相應元素的引用元組組成(類模板) (定製點物件) |