std::ranges::views::cartesian_product, std::ranges::cartesian_product_view
<ranges>
requires (ranges::view <First> && ... && ranges::view <Vs>)
class cartesian_product_view
inline constexpr /*unspecified*/ cartesian_product = /*unspecified*/;
requires /* see below */
concept /*cartesian-product-is-random-access*/ =
(ranges::random_access_range </*maybe-const*/<Const, First>> && ... &&
(ranges::random_access_range </*maybe-const*/<Const, Vs>> &&
concept /*cartesian-product-common-arg*/ =
ranges::common_range <R> ||
concept /*cartesian-product-is-bidirectional*/ =
(ranges::bidirectional_range </*maybe-const*/<Const, First>> && ... &&
(ranges::bidirectional_range </*maybe-const*/<Const, Vs>> &&
concept /*cartesian-product-is-common*/ =
concept /*cartesian-product-is-sized*/ =
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>>,
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);
cartesian_product_view
is a range adaptor that takes n view
s, where n > 0, and produces a view
of tuples calculated by the n-ary cartesian product of the provided ranges. The size of produced view is a multiple of sizes of provided ranges, while each element is a tuple (of references) of the size n.views::cartesian_product
is a customization point object.
- When calling with no argument, views::cartesian_product() is expression-equivalent to views::single (std::tuple ()).
- Otherwise, views::cartesian_product(rs...) is expression-equivalent to ranges::cartesian_product_view<views::all_t <decltype((rs))>...>(rs...).
cartesian_product
satisfies the helper concept /*cartesian-product-is-common*/ (see also common_range
).cartesian_product
uses sized sentinel.view
. Participates in overload resolution only if cartesian_product
satisfies the helper concept /*cartesian-product-common-arg*/.The First
range
passed to cartesian_product_view
is treated specially, since it is only passed through a single time. As a result, several constrains are relaxed on it:
-
First
is aninput_range
instead offorward_range
; -
First
does not have to be asized_range
in order for thecartesian_product_view
to berandom_access_range
orcommon_range
; -
First
does not have to becommon_range
in order for thecartesian_product_view
to bebidirectional_range
.
Contents
Customization point objects
The name views::cartesian_product
denotes a customization point object, which is a const function object of a literal semiregular
class type. See CustomizationPointObject for details.
[edit] Data members
base_
(private)
An object that holds all adapted view
objects.(exposition-only member object*)
[edit] Member functions
sized_range
(public member function) [edit]
Inherited from std::ranges::view_interface
sized_range
or forward_range
(public member function of
std::ranges::view_interface<D>
) [edit]
(public member function of
std::ranges::view_interface<D>
) [edit]
(public member function of
std::ranges::view_interface<D>
) [edit]
(public member function of
std::ranges::view_interface<D>
) [edit]
forward_range
(public member function of
std::ranges::view_interface<D>
) [edit]
bidirectional_range
and common_range
(public member function of
std::ranges::view_interface<D>
) [edit]
n
th element in the derived view, provided only if it satisfies random_access_range
(public member function of
std::ranges::view_interface<D>
) [edit]
[edit] Deduction guides
[edit] Nested classes
[edit] Notes
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_ranges_cartesian_product |
202207L |
(C++23) | std::ranges::cartesian_product_view
|
[edit] Example
#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++); }
Output:
(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 δ)
[edit] References
- C++23 standard (ISO/IEC 14882:2024):
- 26.7.31 Cartesian product view [range.stride]