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 views, 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:
-
Firstis aninput_rangeinstead offorward_range; -
Firstdoes not have to be asized_rangein order for thecartesian_product_viewto berandom_access_rangeorcommon_range; -
Firstdoes not have to becommon_rangein order for thecartesian_product_viewto 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]
nth 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]