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 /*未指定*/ cartesian_product = /*未指定*/; |
(2) | (自 C++23 起) |
调用签名 |
||
template< ranges::viewable_range... Rs > requires /*见下文*/ |
(自 C++23 起) | |
辅助概念 |
||
template< bool Const, class First, class... Vs > concept /*笛卡尔积是随机访问*/ = |
(3) | (仅供说明*) |
template< class R > concept /*笛卡尔积通用参数*/ = |
(4) | (仅供说明*) |
template< bool Const, class First, class... Vs > concept /*笛卡尔积是双向的*/ = |
(5) | (仅供说明*) |
template< class First, class... Vs > concept /*笛卡尔积是通用的*/ = |
(6) | (仅供说明*) |
template< class... Vs > concept /*笛卡尔积是有大小的*/ = |
(7) | (仅供说明*) |
template< bool Const, template<class> class FirstSent, class First, class... Vs > concept /*笛卡尔积是有大小的哨兵*/ = |
(8) | (仅供说明*) |
辅助函数模板 |
||
template< /*cartesian-product-common-arg*/ R > constexpr auto /*cartesian-common-arg-end*/( R& r ) |
(9) | (仅供说明*) |
cartesian_product_view
是一个范围适配器,它接受n 个view
s,其中n > 0,并生成一个view
,该view
包含由提供范围的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
的第一个 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
表示一个自定义点对象,它是一个常量 函数对象,类型为 字面量 semiregular
类类型。为了说明,其类型的 cv 无限定版本表示为 __cartesian_product_fn
。
__cartesian_product_fn
的所有实例都是相等的。调用类型为 __cartesian_product_fn
的不同实例对相同参数的影响是等效的,与表示该实例的表达式是左值还是右值、以及是否为常量限定无关(但是,不保证 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
的任何函数调用运算符都不会参与重载解析。
[edit] 数据成员
成员 | 定义 |
std::tuple<First, Vs...> base_ (私有) |
一个对象,它保存所有已适配的 view 对象。(仅供说明的成员对象*) |
[edit] 成员函数
构造一个 cartesian_product_view (公有成员函数) | |
返回指向开头的迭代器 (公有成员函数) | |
返回指向结尾的迭代器或哨兵 (公有成员函数) | |
返回元素数量。仅当底层(已适配)范围满足 sized_range 时才提供。(公有成员函数) | |
继承自 std::ranges::view_interface | |
返回派生 view 是否为空。仅当它满足 sized_range 或 forward_range 时才提供。( std::ranges::view_interface<D> 的公有成员函数) | |
(C++23) |
返回指向范围开头的常量迭代器。 ( std::ranges::view_interface<D> 的公有成员函数) |
(C++23) |
返回范围常量迭代器的哨兵。 ( std::ranges::view_interface<D> 的公有成员函数) |
返回派生 view 是否不为空。仅当 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> 的公共成员函数) |
[编辑] 推断指南
[编辑] 嵌套类
迭代器类型 (仅供说明的成员类模板*) |
[编辑] 说明
功能测试 宏 | 值 | 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 ,由适应视图的对应元素的元组引用组成。(类模板) (自定义点对象) |