Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
cartesian_product_viewviews::cartesian_product
(C++23)(C++23)

 
 
Definiert in der Header-Datei <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) (seit C++23)
namespace views {

    inline constexpr /*unspecified*/ cartesian_product = /*unspecified*/;

}
(2) (seit C++23)
Aufruf-Signatur
template< ranges::viewable_range... Rs >

    requires /* siehe unten */

constexpr ranges::view auto cartesian_product( Rs&&... rs );
(seit C++23)
Hilfskonzepte
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) (nur Exposition*)
template< class R >

concept /*cartesian-product-common-arg*/ =
    ranges::common_range<R> ||

        (ranges::sized_range<R> && ranges::random_access_range<R>);
(4) (nur Exposition*)
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) (nur Exposition*)
template< class First, class... Vs >

concept /*cartesian-product-is-common*/ =

    /*cartesian-product-common-arg*/<First>;
(6) (nur Exposition*)
template< class... Vs >

concept /*cartesian-product-is-sized*/ =

    (ranges::sized_range<Vs> && ...);
(7) (nur Exposition*)
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) (nur Exposition*)
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) (nur Exposition*)
1) cartesian_product_view ist ein Bereichsadapter, der n views aufnimmt, wobei n > 0 ist, und eine view von Tupeln erzeugt, die durch das n-stellige kartesische Produkt der bereitgestellten Bereiche berechnet werden. Die Größe der erzeugten Ansicht ist ein Vielfaches der Größen der bereitgestellten Bereiche, während jedes Element ein Tupel (von Referenzen) der Größe n ist.
2) views::cartesian_product ist ein Anpassungspunktobjekt.
3) Bestimmt, ob cartesian_product ein Random-Access-Bereich ist (siehe auch random_access_range).
4) Bestimmt, ob cartesian_product ein gemeinsamer Bereich ist (siehe auch common_range).
5) Bestimmt, ob cartesian_product ein bidirektionaler Bereich ist (siehe auch bidirectional_range).
6) Bestimmt, ob cartesian_product das Hilfskonzept /*cartesian-product-is-common*/ erfüllt (siehe auch common_range).
7) Bestimmt, ob cartesian_product ein dimensionierter Bereich ist (siehe auch sized_range).
8) Bestimmt, ob cartesian_product einen dimensionierten Sentinel verwendet.
9) Gibt das Ende der erzeugten view zurück. Nimmt nur an der Auflösung von Überladungen teil, wenn cartesian_product das Hilfskonzept /*cartesian-product-common-arg*/ erfüllt.

Der an cartesian_product_view übergebene Bereich First wird speziell behandelt, da er nur einmal durchlaufen wird. Infolgedessen werden mehrere Einschränkungen für ihn gelockert.

Inhalt

Customization Point Objects

Der Name views::cartesian_product bezeichnet ein Anpassungspunktobjekt, welches ein konstantes Funktionsobjekt eines literalen semiregular-Klassentyps ist. Zu Erklärungszwecken wird die cv-unqualifizierte Version seines Typs als __cartesian_product_fn bezeichnet.

Alle Instanzen von __cartesian_product_fn sind gleich. Die Auswirkungen des Aufrufs verschiedener Instanzen vom Typ __cartesian_product_fn auf dieselben Argumente sind äquivalent, unabhängig davon, ob der Ausdruck, der die Instanz bezeichnet, ein lvalue oder rvalue ist und ob er const-qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Daher kann views::cartesian_product frei kopiert und seine Kopien können austauschbar verwendet werden.

Gegeben eine Menge von Typen Args..., wenn std::declval<Args>()... die Anforderungen für Argumente an views::cartesian_product oben erfüllt, modelliert __cartesian_product_fn

Andernfalls nimmt kein Funktionsaufrufoperator von __cartesian_product_fn an der Auflösung von Überladungen teil.

[bearbeiten] Datenmember

Mitglied Definition
std::tuple<First, Vs...> base_ (private) Ein Objekt, das alle adaptierten view-Objekte speichert.
((exposition-only member object*)

[bearbeiten] Memberfunktionen

konstruiert eine cartesian_product_view
(öffentliche Member-Funktion) [edit]
gibt einen Iterator zum Anfang zurück
(öffentliche Member-Funktion) [edit]
gibt einen Iterator oder Sentinel zum Ende zurück
(öffentliche Member-Funktion) [edit]
gibt die Anzahl der Elemente zurück, nur bereitgestellt, wenn die zugrunde liegende (adaptierte) Range sized_range erfüllt
(öffentliche Member-Funktion) [edit]
Geerbt von std::ranges::view_interface
gibt zurück, ob die abgeleitete Ansicht leer ist, bereitgestellt nur, wenn sie sized_range oder forward_range erfüllt
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur, wenn ranges::empty darauf anwendbar ist
(public member function of std::ranges::view_interface<D>) [edit]
gibt das erste Element in der abgeleiteten View zurück, bereitgestellt, wenn sie forward_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]
gibt das letzte Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie bidirectional_range und common_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]
gibt das n-te Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie random_access_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]

[bearbeiten] Deduktionshilfen

[bearbeiten] Verschachtelte Klassen

der Iterator-Typ
((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*)

[bearbeiten] Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_ranges_cartesian_product 202207L (C++23) std::ranges::cartesian_product_view

[bearbeiten] Beispiel

#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++);
}

Ausgabe

(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 δ)

[bearbeiten] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 26.7.31 Cartesian product view [range.stride]

[bearbeiten] Siehe auch

ein view, der aus Tupeln von Referenzen auf entsprechende Elemente der adaptierten Views besteht
(Klassen-Template) (Customization Point Objekt)[edit]