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 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 是接受 nview 的范围适配器,其中 n > 0,它产生对给定的范围计算 n-元笛卡儿积 所得的元组的 view。所产生视图的大小是给定的范围大小的乘积,而其各个元素是大小为 n 的(引用的)元组。
2) views::cartesian_product 是定制点对象。
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 是否使用了有大小哨位 sized_sentinel
9) 返回所产生 view 的末尾。仅当 cartesian_product 满足辅助概念 /*cartesian-product-common-arg*/ 时才参与重载决议。

传递给 cartesian_product_view 的首个 (First) 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 就实现

否则,__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_rangecommon_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]

参阅

到被适配视图的对应元素的引用元组组成的 view
(类模板) (定制点对象)