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
,其中 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
是否使用带大小哨位。传递给 cartesian_product_view
的 First
range
会被特殊对待,因为它只被单次传递。因此,对其放宽了若干约束
-
First
是input_range
而不是forward_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
类型的不同实例的效果是等效的,无论表示实例的表达式是左值还是右值,以及是否为 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_ (私有) |
一个持有所有已适配 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 th 个元素,仅当它满足 random_access_range 时提供( std::ranges::view_interface<D> 的公有成员函数) |
[编辑] 推导指引
[编辑] 嵌套类
迭代器类型 (仅为阐释目的成员类模板*) |
[编辑] 注解
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__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 (类模板) (定制点对象) |