命名空间
变体
操作

std::ranges::views::cartesian_product, std::ranges::cartesian_product_view

来自 cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
cartesian_product_viewviews::cartesian_product
(C++23)(C++23)
 
 
定义在头文件 <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 /*未指定*/ cartesian_product = /*未指定*/;

}
(2) (自 C++23 起)
调用签名
template< ranges::viewable_range... Rs >

    requires /*见下文*/

constexpr ranges::view auto cartesian_product( Rs&&... rs );
(自 C++23 起)
辅助概念
template< bool Const, class First, class... Vs >

concept /*笛卡尔积是随机访问*/ =
    (ranges::random_access_range</*可能为const*/<Const, First>> && ... &&
        (ranges::random_access_range</*可能为const*/<Const, Vs>> &&

            ranges::sized_range</*可能为const*/<Const, Vs>>));
(3) (仅供说明*)
template< class R >

concept /*笛卡尔积通用参数*/ =
    ranges::common_range<R> ||

        (ranges::sized_range<R> && ranges::random_access_range<R>);
(4) (仅供说明*)
template< bool Const, class First, class... Vs >

concept /*笛卡尔积是双向的*/ =
    (ranges::bidirectional_range</*可能为const*/<Const, First>> && ... &&
        (ranges::bidirectional_range</*可能为const*/<Const, Vs>> &&

            /*笛卡尔积通用参数*/</*可能为const*/<Const, Vs>>));
(5) (仅供说明*)
template< class First, class... Vs >

concept /*笛卡尔积是通用的*/ =

    /*笛卡尔积通用参数*/<First>>;
(6) (仅供说明*)
template< class... Vs >

concept /*笛卡尔积是有大小的*/ =

    (ranges::sized_range<Vs> && ...);
(7) (仅供说明*)
template< bool Const, template<class> class FirstSent, class First, class... Vs >

concept /*笛卡尔积是有大小的哨兵*/ =
    (std::sized_sentinel_for<FirstSent</*可能为const*/<Const, First>>,
        ranges::iterator_t</*可能为const*/<Const, First>>> && ... &&
            (ranges::sized_range</*可能为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 是一个范围适配器,它接受nviews,其中n > 0,并生成一个view,该view 包含由提供范围的n 元笛卡尔积计算出的元组。生成的 view 的大小是提供范围的大小之积,而每个元素都是大小为n 的元组(引用)。
2) views::cartesian_product 是一个自定义点对象。
  • 当没有参数调用时,views::cartesian_product() 等价于views::single(std::tuple())
  • 否则,views::cartesian_product(rs...) 等价于ranges::cartesian_product_view<views::all_t<decltype((rs))>...>(rs...)
3) 确定 cartesian_product 是否是随机访问范围(另请参阅 random_access_range)。
4) 确定 cartesian_product 是否是公共范围(另请参阅 common_range)。
5) 确定 cartesian_product 是否是双向范围(另请参阅 bidirectional_range)。
6) 确定 cartesian_product 是否满足辅助概念 /*cartesian-product-is-common*/(另请参阅 common_range)。
7) 确定 cartesian_product 是否是定长范围(另请参阅 sized_range)。
8) 确定 cartesian_product 是否使用定长哨兵。
9) 返回生成的view 的结尾。仅当 cartesian_product 满足辅助概念 /*cartesian-product-common-arg*/ 时才参与重载解析。

传递给 cartesian_product_view 的第一个 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 建模

否则,__cartesian_product_fn 的任何函数调用运算符都不会参与重载解析。

[edit] 数据成员

成员 定义
std::tuple<First, Vs...> base_ (私有) 一个对象,它保存所有已适配的 view 对象。
(仅供说明的成员对象*)

[edit] 成员函数

构造一个 cartesian_product_view
(公有成员函数) [edit]
返回指向开头的迭代器
(公有成员函数) [edit]
返回指向结尾的迭代器或哨兵
(公有成员函数) [edit]
返回元素数量。仅当底层(已适配)范围满足 sized_range 时才提供。
(公有成员函数) [edit]
继承自 std::ranges::view_interface
返回派生 view 是否为空。仅当它满足 sized_rangeforward_range 时才提供。
(std::ranges::view_interface<D> 的公有成员函数) [edit]
(C++23)
返回指向范围开头的常量迭代器。
(std::ranges::view_interface<D> 的公有成员函数) [edit]
(C++23)
返回范围常量迭代器的哨兵。
(std::ranges::view_interface<D> 的公有成员函数) [edit]
返回派生 view 是否不为空。仅当 ranges::empty 可用于它时才提供。
(std::ranges::view_interface<D> 的公有成员函数) [edit]
返回派生视图中的第一个元素。如果它满足 forward_range,则提供。
(std::ranges::view_interface<D> 的公共成员函数) [编辑]
返回派生视图中的最后一个元素。如果它满足 bidirectional_rangecommon_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]

[编辑] 另请参阅

一个 view,由适应视图的对应元素的元组引用组成。
(类模板) (自定义点对象)[编辑]