std::ranges::views::zip, std::ranges::zip_view
| Definiert in der Header-Datei <ranges> |
||
| template< ranges::input_range... Views > requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0) |
(1) | (seit C++23) |
| namespace views { inline constexpr /*unspecified*/ zip = /*unspecified*/; |
(2) | (seit C++23) |
| Aufruf-Signatur |
||
| template< ranges::viewable_range... Rs > requires /* siehe unten */ |
(seit C++23) | |
zip_view ist ein Range-Adaptor, der eine oder mehrere views entgegennimmt und eine view erzeugt, deren i-tes Element ein Tupel-ähnlicher Wert ist, der aus den i-ten Elementen aller Views besteht. Die Größe der erzeugten View ist das Minimum der Größen aller angepassten Views.views::zip ist ein Anpassungspunktobjekt.Wenn es ohne Argument aufgerufen wird, ist views::zip() ausdrucksäquivalent zu auto(views::empty<std::tuple<>>).
zip_view modelliert immer input_range und modelliert forward_range, bidirectional_range, random_access_range oder sized_range, wenn alle angepassten view-Typen das entsprechende Konzept modellieren.
zip_view modelliert common_range, wenn
- sizeof...(Views) gleich 1 ist und der einzige angepasste View-Typ
common_rangemodelliert, oder - mindestens ein angepasster View-Typ nicht
bidirectional_rangemodelliert und jeder angepasste View-Typcommon_rangemodelliert, oder - jeder angepasste View-Typ sowohl
random_access_rangeals auchsized_rangemodelliert.
Inhalt |
Customization Point Objects
Der Name views::zip bezeichnet ein Anpassungspunktobjekt, bei dem es sich um ein const Funktionsobjekt eines literalen semiregular Klassentyps handelt. Zu Illustrationszwecken wird die cv-unqualifizierte Version seines Typs als __zip_fn bezeichnet.
Alle Instanzen von __zip_fn sind gleich. Die Effekte des Aufrufs unterschiedlicher Instanzen des Typs __zip_fn mit denselben Argumenten 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::zip frei kopiert werden 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::zip erfüllt, modelliert __zip_fn
- std::invocable<__zip_fn, Args...>,
- std::invocable<const __zip_fn, Args...>,
- std::invocable<__zip_fn&, Args...>, und
- std::invocable<const __zip_fn&, Args...>.
Andernfalls nimmt kein Operator für den Funktionsaufruf von __zip_fn an der Überladungsauflösung teil.
[bearbeiten] Datenmitglieder
| Mitglied | Beschreibung |
std::tuple<Views...> views_ |
alle angepassten View-Objekte ((exposition-only member object*) |
[bearbeiten] Member-Funktionen
konstruiert eine zip_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 wenn jeder zugrunde liegende (angepasste) Bereich 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] Deduktionsleitfäden
[bearbeiten] Verschachtelte Klassen
| der Iterator-Typ ((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*) | |
der Sentinel-Typ, der verwendet wird, wenn zip_view kein common_range ist((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*) |
[bearbeiten] Hilfstemplates
| template< class... Views > constexpr bool enable_borrowed_range<ranges::zip_view<Views...>> = |
(seit C++23) | |
Diese Spezialisierung von ranges::enable_borrowed_range lässt zip_view borrowed_range erfüllen, wenn jeder zugrunde liegende View dies erfüllt.
[bearbeiten] Anmerkungen
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges_zip |
202110L |
(C++23) | ranges::zip_view,ranges::zip_transform_view, ranges::adjacent_view, ranges::adjacent_transform_view |
[bearbeiten] Beispiel
#include <array> #include <iostream> #include <list> #include <ranges> #include <string> #include <tuple> #include <vector> void print(auto const rem, auto const& range) { for (std::cout << rem; auto const& elem : range) std::cout << elem << ' '; std::cout << '\n'; } int main() { auto x = std::vector{1, 2, 3, 4}; auto y = std::list<std::string>{"α", "β", "γ", "δ", "ε"}; auto z = std::array{'A', 'B', 'C', 'D', 'E', 'F'}; print("Source views:", ""); print("x: ", x); print("y: ", y); print("z: ", z); print("\nzip(x,y,z):", ""); for (std::tuple<int&, std::string&, char&> elem : std::views::zip(x, y, z)) { std::cout << std::get<0>(elem) << ' ' << std::get<1>(elem) << ' ' << std::get<2>(elem) << '\n'; std::get<char&>(elem) += ('a' - 'A'); // modifies the element of z } print("\nAfter modification, z: ", z); }
Ausgabe
Source views: x: 1 2 3 4 y: α β γ δ ε z: A B C D E F zip(x,y,z): 1 α A 2 β B 3 γ C 4 δ D After modification, z: a b c d E F
[bearbeiten] Siehe auch
ein view, der aus den Ergebnissen der Anwendung einer Transformationsfunktion auf entsprechende Elemente der adaptierten Views besteht(Klassen-Template) (Customization Point Objekt) | |
nimmt einen view von tuple-ähnlichen Werten und eine Zahl N und erzeugt einen view des N-ten Elements jedes Tupels(Klassen-Template) (Range-Adaptor-Objekt) |