std::ranges::views::cartesian_product, std::ranges::cartesian_product_view
| Definiert in der Header-Datei <ranges> |
||
| template< ranges::input_range First, ranges::forward_range... Vs > requires (ranges::view<First> && ... && ranges::view<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 */ |
(seit C++23) | |
| Hilfskonzepte |
||
| template< bool Const, class First, class... Vs > concept /*cartesian-product-is-random-access*/ = |
(3) | (nur Exposition*) |
| template< class R > concept /*cartesian-product-common-arg*/ = |
(4) | (nur Exposition*) |
| template< bool Const, class First, class... Vs > concept /*cartesian-product-is-bidirectional*/ = |
(5) | (nur Exposition*) |
| template< class First, class... Vs > concept /*cartesian-product-is-common*/ = |
(6) | (nur Exposition*) |
| template< class... Vs > concept /*cartesian-product-is-sized*/ = |
(7) | (nur Exposition*) |
| template< bool Const, template<class> class FirstSent, class First, class... Vs > concept /*cartesian-is-sized-sentinel*/ = |
(8) | (nur Exposition*) |
| Helper function templates |
||
| template< /*cartesian-product-common-arg*/ R > constexpr auto /*cartesian-common-arg-end*/( R& r ) |
(9) | (nur Exposition*) |
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.views::cartesian_product ist ein Anpassungspunktobjekt.- Wenn mit keinem Argument aufgerufen, ist views::cartesian_product() ausdrucksäquivalent zu views::single(std::tuple()).
- Andernfalls ist views::cartesian_product(rs...) ausdrucksäquivalent zu ranges::cartesian_product_view<views::all_t<decltype((rs))>...>(rs...).
cartesian_product das Hilfskonzept /*cartesian-product-is-common*/ erfüllt (siehe auch common_range).cartesian_product einen dimensionierten Sentinel verwendet.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.
-
Firstist eininput_rangeanstelle einesforward_range; -
Firstmuss keinsized_rangesein, damitcartesian_product_vieweinrandom_access_rangeodercommon_rangeist; -
Firstmuss keincommon_rangesein, damitcartesian_product_vieweinbidirectional_rangeist.
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
- std::invocable<__cartesian_product_fn, Args...>,
- std::invocable<const __cartesian_product_fn, Args...>,
- std::invocable<__cartesian_product_fn&, Args...>, und
- std::invocable<const __cartesian_product_fn&, Args...>.
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) | |
| gibt einen Iterator zum Anfang zurück (öffentliche Member-Funktion) | |
| gibt einen Iterator oder Sentinel zum Ende zurück (öffentliche Member-Funktion) | |
gibt die Anzahl der Elemente zurück, nur bereitgestellt, wenn die zugrunde liegende (adaptierte) Range sized_range erfüllt(öffentliche Member-Funktion) | |
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>) | |
| (C++23) |
gibt einen konstanten Iterator zum Anfang des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| (C++23) |
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| 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>) | |
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>) | |
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>) | |
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>) | |
[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
| (C++23) |
ein view, der aus Tupeln von Referenzen auf entsprechende Elemente der adaptierten Views besteht(Klassen-Template) (Customization Point Objekt) |