std::ranges::views::concat, std::ranges::concat_view
| Definiert in der Header-Datei <ranges> |
||
| template< ranges::input_range... Views > requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0) && |
(1) | (seit C++26) |
| namespace views { inline constexpr /* unspecified */ concat = /* unspecified */; |
(2) | (seit C++26) |
| Aufruf-Signatur |
||
| template< ranges::viewable_range... Rs > requires /* siehe unten */ |
(seit C++26) | |
| Hilfstypaliasen |
||
template< class... Rs > using /*concat-reference-t*/ = ranges::common_reference_t<ranges::range_reference_t<Rs>...>; |
(3) | (nur Exposition*) |
template< class... Rs > using /*concat-value-t*/ = std::common_type_t<ranges::range_value_t<Rs>...>; |
(4) | (nur Exposition*) |
template< class... Rs > using /*concat-rvalue-reference-t*/ = |
(5) | (nur Exposition*) |
| Hilfskonzepte |
||
template< class Ref, class RRef, class It > concept /*concat-indirectly-readable-impl*/ = /* siehe Beschreibung */; |
(6) | (nur Exposition*) |
template< class... Rs > concept /*concatable*/ = /* siehe Beschreibung */; |
(7) | (nur Exposition*) |
concat_view stellt eine view-Fabrik bereit, die eine beliebige Anzahl von Bereichen als Argumentliste entgegennimmt und eine Ansicht bietet, die vom ersten Element des ersten Bereichs beginnt, am letzten Element des letzten Bereichs endet und alle Bereichselemente dazwischen in der Reihenfolge ihrer Argumente verkettet, d. h. effektiv aneinanderreiht.
views ist, von denen jeder mindestens input_range modelliert und concatable (7) ist.views::concat ist ein Customization Point Object.Gegeben sei ein Paket von Ausdrücken exprs, der Ausdruck views::concat(exprs...) ist ausdrucksäquivalent zu
- views::all(exprs...) wenn exprs ein Paket mit nur einem Element ist, dessen Typ
input_rangemodelliert, - concat_view(exprs...) andernfalls.
iterator::value_type, der zusätzlich den value_type der zugrundeliegenden Bereiche berücksichtigt, um Fälle zu unterstützen, in denen die zugrundeliegenden Bereiche Proxy-Iteratoren haben.iter_move anpassen.indirectly-readable-Konzept für den iterator, damit concat_view input_range modellieren kann.template< class... Rs > concept /*concat-indirectly-readable*/ = // exposition only std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...>&> && std::common_reference_with</*concat-reference-t*/<Rs...>&&, /*concat-rvalue-reference-t*/<Rs...>&&> && std::common_reference_with</*concat-rvalue-reference-t*/<Rs...>&&, /*concat-value-t*/<Rs...> const&> && (/*concat-indirectly-readable-impl*/</*concat-reference-t*/<Rs...>, /*concat-rvalue-reference-t*/<Rs...>, ranges::iterator_t<Rs>> && ...);
template< class Ref, class RRef, class It > concept /*concat-indirectly-readable-impl*/ = // exposition only requires(const It it) { { *it } -> std::convertible_to<Ref>; { ranges::iter_move(it)} -> std::convertible_to<RRef>; };
template< class... Rs > concept /*concatable*/ = requires { // exposition only typename /*concat-reference-t*/<Rs...>; typename /*concat-value-t*/<Rs...>; typename /*concat-rvalue-reference-t*/<Rs...>; } && /*concat-indirectly-readable*/<Rs...>;
concat_view modelliert immer input_range und modelliert forward_range, bidirectional_range, random_access_range oder sized_range, wenn jeder angepasste view-Typ das entsprechende Konzept modelliert.
concat_view kann ein common_range sein, wenn der letzte zugrundeliegende Bereich common_range modelliert.
Inhalt |
Customization Point Objects
Der Name views::concat bezeichnet ein Customization Point Object, das ein const Funktionsobjekt vom Typ Literal semiregular ist. Zu Erklärungszwecken wird die cv-unqualifizierte Version seines Typs als __concat_fn bezeichnet.
Alle Instanzen von __concat_fn sind gleich. Die Auswirkungen des Aufrufs verschiedener Instanzen des Typs __concat_fn mit denselben Argumenten 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). Daher kann views::concat frei kopiert und seine Kopien können austauschbar verwendet werden.
Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die Anforderungen für Argumente an views::concat erfüllt, modelliert __concat_fn
- std::invocable<__concat_fn, Args...>,
- std::invocable<const __concat_fn, Args...>,
- std::invocable<__concat_fn&, Args...>, und
- std::invocable<const __concat_fn&, Args...>.
Andernfalls nimmt kein Funktionsaufrufoperator von __concat_fn an der Überladungsauflösung teil.
[edit] Datenmember
| Mitglied | Beschreibung |
std::tuple<Views...> views_ |
alle angepassten View-Objekte ((exposition-only member object*) |
[edit] Memberfunktionen
konstruiert eine concat_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>) | |
[edit] Deduktionsführer
[edit] Verschachtelte Klassen
| Klassenname | Definition |
| der Iterator-Typ ((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*) |
[edit] Hilfstemplates
Es gibt keine Spezialisierung von ranges::enable_borrowed_range für concat_view, da dies erfordern würde, dass die Iterator-Implementierung jederzeit eine Kopie aller Iteratoren und Sentinels aller zugrundeliegenden Bereiche enthält.
[edit] Hinweise
Kein Argument views::concat() ist ill-formed, da es keine sinnvolle Möglichkeit gibt, einen Elementtyp T zu bestimmen. Ein einzelnes Argument views::concat(r) ist ausdrucksäquivalent zu views::all(r).
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges_concat |
202403L |
(C++26) | std::ranges::concat_view
|
[edit] Beispiel
Die Vorabversion kann auf Compiler Explorer eingesehen werden.
#include <cassert> #include <list> #include <print> #include <ranges> #include <vector> int main() { std::vector<int> v0{1, 2, 3}, v1{4, 5}; int a[]{6, 7}; int i{8}; auto ie{std::views::single(i)}; auto con = std::views::concat(v0, v1, a, ie); assert(con.size() == v0.size() + v1.size() + std::size(a) + ie.size()); std::println("con.size(): {}", con.size()); std::println("con: {}", con); con[6] = 42; // con is random_access_range, operator[] returns a reference assert(a[1] == 42); // a[1] was modified via con[6] std::println("con: {}", con); std::list<int> l{7, 8}; // list is bidirectional range auto cat = std::views::concat(v0, l); std::println("cat: {}", cat); // cat[0] = 13; // compile-time error: cat is bidirectional => no operator[] }
Ausgabe
con.size(): 8 con: [1, 2, 3, 4, 5, 6, 7, 8] con: [1, 2, 3, 4, 5, 6, 42, 8] cat: [1, 2, 3, 7, 8]
[edit] Referenzen
- C++26 Standard (ISO/IEC 14882:2026)
- 26.7.18 Concat view [range.concat]
[edit] Siehe auch
| (C++20) |
ein view, der aus der Sequenz besteht, die durch Abflachung eines view von ranges gebildet wird(Klassen-Template) (Range-Adaptor-Objekt) |
ein view, der aus der Sequenz besteht, die durch Abflachung eines Views von Ranges gebildet wird, mit dem Trennzeichen zwischen den Elementen(Klassen-Template) (Range-Adaptor-Objekt) | |
| (C++23) |
ein view, der aus Tupeln von Referenzen auf entsprechende Elemente der adaptierten Views besteht(Klassen-Template) (Customization Point Objekt) |
eine view, die aus Tupeln von Ergebnissen besteht, welche durch das n-äre kartesische Produkt der angepassten Views berechnet werden(Klassenschablone) (Customization Point Objekt) |