Namespaces
Variants

std::ranges:: views:: concat, std::ranges:: concat_view

From cppreference.net
Ranges library
Range adaptors
(Anmerkung: Der bereitgestellte HTML-Code enthält keinen übersetzbaren Text, da alle Tags leer sind. Die Struktur bleibt unverändert, wie angefordert.)
Definiert im Header <ranges>
template < ranges:: input_range ... Views >

erfordert ( ranges:: view < Views > && ... ) && ( sizeof... ( Views ) > 0 ) &&
/*concatable*/ < Views... >
class concat_view

: public ranges:: view_interface < concat_view < Views... >>
(1) (seit C++26)
namespace views {

inline constexpr /* unspecified */ concat = /* unspecified */ ;

}
(2) (seit C++26)
Aufrufsignatur
template < ranges:: viewable_range ... Rs >

requires /* siehe unten */

constexpr ranges:: view auto concat ( Rs && ... rs ) ;
(seit C++26)
Hilfstyp-Aliase
template < class ... Rs >

using /*concat-reference-t*/ =

ranges:: common_reference_t < ranges:: range_reference_t < Rs > ... > ;
(3) ( exposition only* )
template < class ... Rs >
using /*concat-value-t*/ = std:: common_type_t < ranges:: range_value_t < Rs > ... > ;
(4) ( Nur zur Darstellung* )
template < class ... Rs >

using /*concat-rvalue-reference-t*/ =

ranges:: common_reference_t < ranges:: range_rvalue_reference_t < Rs > ... > ;
(5) ( Nur zur Darstellung* )
Hilfskonzepte
template < class Ref, class RRef, class It >
concept /*concat-indirectly-readable-impl*/ = /* siehe Beschreibung */ ;
(6) ( nur zur Darstellung* )
template < class ... Rs >
concept /*concatable*/ = /* siehe Beschreibung */ ;
(7) ( nur zur Darstellung* )

concat_view stellt eine view Factory bereit, die eine beliebige Anzahl von Bereichen als Argumentliste entgegennimmt und eine Ansicht bietet, die beim ersten Element des ersten Bereichs beginnt, beim letzten Element des letzten Bereichs endet und dabei alle Elemente der Bereiche in der Reihenfolge der Argumente zwischensequenziert, wodurch die Argumentbereiche effektiv verkettet oder aneinandergereiht werden.

1) Die Klassenvorlage mit einem Template-Parameter, der ein nicht-leeres Paket von view s ist, von denen jede mindestens input_range modelliert und concatable (7) ist.
2) views::concat ist ein Customization Point Object.

Gegeben einen Pack von Subausdrücken exprs , ist der Ausdruck views :: concat ( exprs... ) ausdrucksäquivalent zu

  • views:: all ( exprs... ) falls exprs ein Pack mit nur einem Element ist, dessen Typ input_range modelliert,
  • concat_view ( exprs... ) andernfalls.
3) Repräsentiert den Referenztyp. Eine zusätzliche Einschränkung ist erforderlich, um sicherzustellen, dass jeder zugrundeliegende Bereichs- ranges:: range_reference_t konvertierbar ist zu ranges:: common_reference_t .
4) Der iterator ::value_type der zusätzlich die value_type der zugrundeliegenden Ranges respektiert, um die Fälle zu unterstützen, in denen die zugrundeliegenden Ranges Proxy-Iteratoren haben.
5) Die Rvalue-Referenz, die auch die Fälle korrekt unterstützt, in denen zugrunde liegende Iteratoren iter_move anpassen.
6) Definiert das indirectly-readable Konzept für den iterator , sodass concat_view das input_range modellieren kann.
Entspricht:
template< class... Rs >
concept /*concat-indirectly-readable*/ = // nur zur Darstellung
    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>> && ...);
wobei das nur zur Darstellung dienende Konzept /*concat-indirectly-readable-impl*/ ist
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>;
    };
7) Bestimmt, ob zwei oder mehr verschiedene Bereiche zu einer Sequenz angepasst werden können, die selbst einen Bereich modelliert. Entspricht:
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 stets input_range und modelliert forward_range , bidirectional_range , random_access_range oder sized_range , falls jeder adaptierte view -Typ das entsprechende Konzept modelliert.

concat_view kann ein common_range sein, wenn der letzte zugrundeliegende Bereich common_range modelliert.

Inhaltsverzeichnis

Customization Point Objects

Der Name views::concat bezeichnet ein Customization Point Object , welches ein konstantes Function Object eines Literal semiregular -Klassentyps ist. Weitere Details finden Sie unter CustomizationPointObject .

Datenmitglieder

Mitglied Beschreibung
std:: tuple < Views... > views_ Alle angepassten View-Objekte
( Nur-Darstellungs-Mitgliedsobjekt* )

Memberfunktionen

konstruiert einen concat_view
(öffentliche Elementfunktion)
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion)
gibt einen Iterator oder Sentinel zum Ende zurück
(öffentliche Elementfunktion)
gibt die Anzahl der Elemente zurück, bereitgestellt nur wenn der zugrundeliegende (adaptierte) Bereich sized_range erfüllt
(öffentliche Elementfunktion)
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
(öffentliche Elementfunktion von std::ranges::view_interface<D> )
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(öffentliche Elementfunktion von std::ranges::view_interface<D> )
(C++23)
gibt einen Sentinel für den konstanten Iterator des Bereichs zurück
(öffentliche Elementfunktion von std::ranges::view_interface<D> )
gibt zurück ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur wenn ranges::empty darauf anwendbar ist
(öffentliche Elementfunktion von std::ranges::view_interface<D> )
gibt das erste Element in der abgeleiteten Ansicht zurück, bereitgestellt wenn sie forward_range erfüllt
(öffentliche Elementfunktion von std::ranges::view_interface<D> )
gibt das letzte Element in der abgeleiteten Ansicht zurück, bereitgestellt nur wenn sie bidirectional_range und common_range erfüllt
(öffentliche Elementfunktion von std::ranges::view_interface<D> )
gibt das n te Element in der abgeleiteten Ansicht zurück, bereitgestellt nur wenn sie random_access_range erfüllt
(öffentliche Elementfunktion von std::ranges::view_interface<D> )

Deduktionshilfen

Geschachtelte Klassen

Klassenname Definition
der Iteratortyp
( Nur zur Darstellung dienende Mitgliedsklassenvorlage* )

Hilfsvorlagen

Es gibt keine Spezialisierung von ranges:: enable_borrowed_range für concat_view , da dies erfordern würde, dass die Iterator-Implementierung zu jeder Zeit eine Kopie aller Iteratoren und Sentinel-Objekte aller zugrundeliegenden Bereiche enthalten müsste.

Hinweise

Kein Argument views :: concat ( ) ist fehlerhaft, 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

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]

Referenzen

  • C++26-Standard (ISO/IEC 14882:2026):
  • 26.7.18 Concat-Ansicht [range.concat]

Siehe auch

eine view bestehend aus der durch Abflachen einer view von range s erhaltenen Sequenz
(Klassentemplate) (Range-Adapter-Objekt)
eine view bestehend aus der durch Abflachen einer View von Ranges erhaltenen Sequenz, mit Trennzeichen zwischen Elementen
(Klassentemplate) (Range-Adapter-Objekt)
eine view bestehend aus Tupeln von Referenzen auf entsprechende Elemente der adaptierten Views
(Klassentemplate) (Customization-Point-Objekt)
eine view bestehend aus Tupeln von Ergebnissen, berechnet durch das n-äre kartesische Produkt der adaptierten Views
(Klassentemplate) (Customization-Point-Objekt)