std::ranges::views::cartesian_product, std::ranges::cartesian_product_view - cppreference.com (original) (raw)
std::ranges::cartesian_product_view
Defined in header | ||
---|---|---|
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) | (since C++23) |
namespace views { inline constexpr /*unspecified*/ cartesian_product = /*unspecified*/; } | (2) | (since C++23) |
Call signature | ||
template< ranges::viewable_range... Rs > requires /* see below */ constexpr ranges::view auto cartesian_product( Rs&&... rs ); | (since C++23) | |
Helper concepts | ||
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) | (exposition only*) |
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) | (exposition only*) |
template< class First, class... Vs > concept /*cartesian-product-is-common*/ = /*cartesian-product-common-arg*/<First>; | (6) | (exposition only*) |
template< class... Vs > concept /*cartesian-product-is-sized*/ = (ranges::sized_range<Vs> && ...); | (7) | (exposition only*) |
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) | (exposition only*) |
Helper function templates | ||
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) | (exposition only*) |
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.Determines if
cartesian_product
is a random access range (see also random_access_range).Determines if
cartesian_product
is a common range (see also common_range).Determines if
cartesian_product
is a bidirectional range (see also bidirectional_range).Determines if
cartesian_product
satisfies the helper concept /*cartesian-product-is-common*/ (see also common_range).Determines if
cartesian_product
is a sized range (see also sized_range).Determines if
cartesian_product
uses sized sentinel.Returns the end of the produced 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 an input_range instead of forward_range;First
does not have to be a sized_range in order for thecartesian_product_view
to be random_access_range or common_range;First
does not have to be common_range in order for thecartesian_product_view
to be bidirectional_range.
Contents
- 1 Customization point objects
- 2 Data members
- 3 Member functions
- 4 Deduction guides
- 5 Nested classes
- 6 Notes
- 7 Example
- 8 References
- 9 See also
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
Member | Definition |
---|---|
std::tuple<First, Vs...> base_ (private) | An object that holds all adapted view objects.(exposition-only member object*) |
[edit] Member functions
(constructor) | constructs a cartesian_product_view (public member function) [edit] |
---|---|
begin | returns an iterator to the beginning (public member function) [edit] |
end | returns an iterator or a sentinel to the end (public member function) [edit] |
size | returns the number of elements, provided only if the underlying (adapted) range satisfies sized_range (public member function) [edit] |
Inherited from std::ranges::view_interface | |
empty | returns whether the derived view is empty, provided only if it satisfies sized_range or forward_range (public member function of std::ranges::view_interface) [edit] |
cbegin(C++23) | returns a constant iterator to the beginning of the range (public member function of std::ranges::view_interface) [edit] |
cend(C++23) | returns a sentinel for the constant iterator of the range (public member function of std::ranges::view_interface) [edit] |
operator bool | returns whether the derived view is not empty, provided only if ranges::empty is applicable to it (public member function of std::ranges::view_interface) [edit] |
front | returns the first element in the derived view, provided if it satisfies forward_range (public member function of std::ranges::view_interface) [edit] |
back | returns the last element in the derived view, provided only if it satisfies bidirectional_range and common_range (public member function of std::ranges::view_interface) [edit] |
operator[] | returns the nth element in the derived view, provided only if it satisfies random_access_range (public member function of std::ranges::view_interface) [edit] |
[edit] Deduction guides
[edit] Nested classes
| | the iterator type(exposition-only member class template*) | | ------------------------------------------------------------- |
[edit] Notes
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_ranges_cartesian_product | 202207L | (C++23) | std::ranges::cartesian_product_view |
[edit] Example
#include #include #include #include #include #include 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]