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 /*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_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
代表一个定制点对象,它是某个字面 semiregular
类类型的 const 函数对象。为阐述目的,以 __cartesian_product_fn
表示它的类型的 cv 无限定版本。
__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 | |
返回视图是否为空。仅当视图满足 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.32 Cartesian product view [range.cartesian]
参阅
(C++23) |
到被适配视图的对应元素的引用元组组成的 view (类模板) (定制点对象) |