std::ranges::views::cartesian_product, std::ranges::cartesian_product_view
来自cppreference.com
| 在标头 <ranges> 定义
|
||
| |
(1) | (C++23 起) |
| |
(2) | (C++23 起) |
| 调用签名 |
||
| |
(C++23 起) | |
| 辅助概念 |
||
| |
(3) | (仅用于阐述*) |
| |
(4) | (仅用于阐述*) |
| |
(5) | (仅用于阐述*) |
| |
(6) | (仅用于阐述*) |
| |
(7) | (仅用于阐述*) |
| |
(8) | (仅用于阐述*) |
| 辅助函数模板 |
||
| |
(9) | (仅用于阐述*) |
1)
cartesian_product_view 是接受 n 个 view 的范围适配器,其中 n > 0,它产生对给定的范围计算 n-元笛卡儿积 所得的元组的 view。所产生视图的大小是给定的范围大小的乘积,而其各个元素是大小为 n 的(引用的)元组。2)
views::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 类类型的 const 函数对象。 细节参见定制点对象 (CustomizationPointObject) 。
数据成员
| 成员 | 定义 |
std::tuple<First, Vs...> base_ (私有)
|
保存所有被适配的 view 对象的对象。(仅用于阐述的成员对象*) |
成员函数
构造 cartesian_product_view (公开成员函数) | |
| 返回指向起始的迭代器 (公开成员函数) | |
| 返回 指向末尾的迭代器或哨位 (公开成员函数) | |
返回元素数,仅当底层(适配的)范围满足 sized_range 时才提供 (公开成员函数) | |
继承自 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 (类模板) (定制点对象) |