Namensräume
Varianten
Aktionen

std::ranges::views::zip_transform, std::ranges::zip_transform_view

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

    requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0) &&
              std::is_object_v<F> && std::regular_invocable<
                  F&, ranges::range_reference_t<Views>...> &&
              /*can-reference*/<std::invoke_result_t<
                  F&, ranges::range_reference_t<Views>...>>
class zip_transform_view

     : public ranges::view_interface<zip_transform_view<F, Views...>>
(1) (seit C++23)
namespace views {

    inline constexpr /*unspecified*/ zip_transform = /*unspecified*/;

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

    requires /* siehe unten */

constexpr auto zip_transform( F&& f, Rs&&... rs );
(seit C++23)
1) zip_transform_view ist ein Range-Adaptor, der ein aufrufbarkeitsobjekt und ein oder mehrere views nimmt und einen view erzeugt, dessen i-tes Element das Ergebnis der Anwendung des aufrufbarkeitsobjekts auf die i-ten Elemente aller Views ist.
Ein Typ T modelliert das Exposition-only-Konzept /*can-reference*/, wenn und nur wenn T& ein gültiger Typ ist.
2) views::zip_transform ist ein Customization-Point-Objekt.

Beim Aufruf mit einem Argument f sei FD std::decay_t<decltype(f)>, wenn

dann ist views::zip_transform(f) ausdrucksäquivalent zu ((void)f, auto(views::empty<std::decay_t<std::invoke_result_t<FD&>>>)). Andernfalls ist der Aufruf von views::zip_transform ill-formed.

Beim Aufruf mit mehr als einem Argument f und rs... ist views::zip_transform(f, rs...) ausdrucksäquivalent zu ranges::zip_transform_view(f, rs...).

zip_transform_view modelliert die Konzepte random_access_range, bidirectional_range, forward_range, input_range, common_range und sized_range, wenn die zugrunde liegende ranges::zip_view<Views...> die jeweiligen Konzepte modelliert.

Inhalt

Customization Point Objects

Der Name views::zip_transform bezeichnet ein Customization-Point-Objekt, ein const Funktionsobjekt vom Literal-Typ semiregular. Zu Expositionszwecken wird die cv-unqualified-Version seines Typs als __zip_transform_fn bezeichnet.

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

Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die Anforderungen an die Argumente für views::zip_transform erfüllt, wie oben beschrieben, dann modelliert __zip_transform_fn

Andernfalls nimmt kein Operator des Funktionsobjekts von __zip_transform_fn an der Overload-Auflösung teil.

[edit] Member functions

konstruiert eine zip_transform_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 (adaptierte) 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]

[edit] Deduction guides

[edit] Member types

Mitgliedertyp Definition
InnerView (private) ranges::zip_view<Views...>.
((nur zur Veranschaulichung)*)
ziperator (private)
zentinel (private)

[edit] Data members

Member-Objekt Definition
zip_ (private) Ein zugrunde liegendes View-Objekt vom Typ InnerView
((exposition-only member object*)
fun_ (private) Ein umschlossenes aufrufbares Objekt vom Typ movable-box<F>
((exposition-only member object*)

[edit] Nested classes

der Iterator-Typ
((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*)
der Sentinel-Typ, der verwendet wird, wenn die zugrunde liegende zip_view keine common_range ist
((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*)

[edit] Notes

Feature-Test-Makro Wert Std Feature
__cpp_lib_ranges_zip 202110L (C++23) ranges::zip_view,
std::ranges::zip_transform_view,
ranges::adjacent_view,
ranges::adjacent_transform_view

[edit] Example

#include <array>
#include <iostream>
#include <list>
#include <ranges>
#include <vector>
 
void print(auto const rem, auto const& r)
{
    std::cout << rem << '{'; 
    for (char o[]{0,' ',0}; auto const& e : r)
        std::cout << o << e, *o = ',';
    std::cout << "}\n";
}
 
int main()
{
    auto v1 = std::vector<float>{1, 2, 3};
    auto v2 = std::list<short>{1, 2, 3, 4};
    auto v3 = std::to_array({1, 2, 3, 4, 5});
 
    auto add = [](auto a, auto b, auto c) { return a + b + c; };
 
    auto sum = std::views::zip_transform(add, v1, v2, v3);
 
    print("v1:  ", v1);
    print("v2:  ", v2);
    print("v3:  ", v3);
    print("sum: ", sum);
}

Ausgabe

v1:  {1, 2, 3}
v2:  {1, 2, 3, 4}
v3:  {1, 2, 3, 4, 5}
sum: {3, 6, 9}

[edit] See also

ein view, der aus Tupeln von Referenzen auf entsprechende Elemente der adaptierten Views besteht
(Klassen-Template) (Customization Point Objekt)[edit]
ein view einer Sequenz, der eine Transformationsfunktion auf jedes Element anwendet
(Klassen-Template) (Range-Adaptor-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]