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) | ( 仅用于说明* ) |
|
辅助函数模板
|
||
|
<span
|
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; -
即使
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_
(私有)
|
存储所有被适配
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
(类模板) (定制点对象) |