std::ranges::views::cartesian_product, std::ranges::cartesian_product_view
来自 zh.cppreference.net
| 定义于头文件 <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 起) |
| 调用签名 |
||
template< ranges::viewable_range... Rs >
requires /* see below */
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是一个范围适配器,它接受 n 个views,其中 n > 0,并生成一个view,其中的元组由所提供的范围的n元笛卡尔积计算得出。生成的视图的大小是所提供范围大小的乘积,而每个元素是大小为 n的(引用)元组。2)
views::cartesian_product是一个定制点对象。
8)确定
cartesian_product 是否使用有大小哨位。传递给 First 的rangecartesian_product_view 会被特殊处理,因为它只被传递一次。因此,对其的一些约束被放宽:
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
类类型。详情请参阅
定制点对象
。
数据成员
| 成员 | 描述 |
std::tuple<First, Vs...> base_ (私有)
|
一个包含所有被适配的 视图 对象的对象 (仅用于阐述的成员对象*) |
成员函数
构造
cartesian_product_view
(公开成员函数) |
|
|
返回指向起始的迭代器
(公开成员函数) |
|
|
返回指向末尾的迭代器或哨位
(公开成员函数) |
|
返回元素数量,仅当底层(适配的)范围满足
sized_range
时提供
(公开成员函数) |
|
继承自 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
(类模板) (定制点对象) |