Namensräume
Varianten
Aktionen

std::ranges::views::zip, std::ranges::zip_view

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
 
Definiert in der Header-Datei <ranges>
template< ranges::input_range... Views >

    requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0)
class zip_view

    : public ranges::view_interface<zip_view<Views...>>
(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 */

constexpr ranges::view auto zip( Rs&&... rs );
(seit C++23)
1) 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.
2) views::zip ist ein Anpassungspunktobjekt.

Wenn es ohne Argument aufgerufen wird, ist views::zip() ausdrucksäquivalent zu auto(views::empty<std::tuple<>>).

Andernfalls ist views::zip(rs...) *ausdrucksäquivalent* zu ranges::zip_view<views::all_t<decltype((rs))>...>(rs...).

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

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

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) [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 wenn jeder zugrunde liegende (angepasste) Bereich 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] 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...>> =

    (ranges::enable_borrowed_range<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)[edit]
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)[edit]