Namespaces
Variants

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

Von de.cppreference.net
 
 
Ranges-Bibliothek
Bereichsadaptoren
 
 
Definiert in Header <ranges>
template< ranges::input_range... Views >
    requires (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 /* see below */
constexpr ranges::view auto concat( Rs&&... rs );
(seit C++26)
Hilfstyp-Aliasen
template< class... Rs >
using /*concat-reference-t*/ =
    ranges::common_reference_t<ranges::range_reference_t<Rs>...>;
(3) (nur zur Veranschaulichung*)
template< class... Rs >
using /*concat-value-t*/ = std::common_type_t<ranges::range_value_t<Rs>...>;
(4) (nur zur Veranschaulichung*)
template< class... Rs >
using /*concat-rvalue-reference-t*/ =
    ranges::common_reference_t<ranges::range_rvalue_reference_t<Rs>...>;
(5) (nur zur Veranschaulichung*)
Hilfskonzepte
template< class Ref, class RRef, class It >
concept /*concat-indirectly-readable-impl*/ = /* see description */;
(6) (nur zur Veranschaulichung*)
template< class... Rs >
concept /*concatable*/ = /* see description */;
(7) (nur zur Veranschaulichung*)

concat_view stellt eine Ansichtsfabrik bereit, die eine beliebige Anzahl von Bereichen als Argumentliste nimmt und eine Ansicht bereitstellt, die mit dem ersten Element des ersten Bereichs beginnt, mit dem letzten Element des letzten Bereichs endet und alle Bereichselemente dazwischen in der Reihenfolge der Argumente anordnet, wodurch die Argumentbereiche effektiv konkateniert (aneinandergereiht) werden.

1) Die Klassenschablone mit einem Template-Parameter, der ein nichtleeres Paket von Ansichtenn ist, von denen jede mindestens input_range modelliert und concatable (7) erfüllt.
2) views::concat ist ein Anpassungspunktobjekt.

Gegeben ein Paket von Unterausdrücken exprs, ist der Ausdruck views::concat(exprs...) ausdrucksäquivalent zu

  • views::all(exprs...) falls exprs ein Paket mit nur einem Element ist, dessen Typ input_range modelliert,
  • concat_view(exprs...) andernfalls.
3) Stellt den Referenztyp dar. Eine zusätzliche Einschränkung ist erforderlich, um sicherzustellen, dass jedes ranges::range_reference_t der zugrunde liegenden Bereiche in ranges::common_reference_t konvertierbar ist.
4) Der iterator::value_type, der zusätzlich die value_type der zugrunde liegenden Bereiche berücksichtigt, um die Fälle zu unterstützen, in denen die zugrunde liegenden Bereiche Proxy-Iteratoren haben.
5) Die Rvalue-Referenz, die ebenfalls korrekt die Fälle unterstützt, in denen zugrunde liegende Iteratoren iter_move anpassen.
6) Definiert das indirectly-readable-Konzept für die iterator, sodass concat_view input_range modellieren kann.
Äquivalent zu:
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>> && ...);
wobei das nur zur Veranschaulichung dienende Konzept /*concat-indirectly-readable-impl*/ wie folgt definiert 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 adaptiert werden können, die selbst einen Bereich modelliert. Äquivalent zu:
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 adaptierte Ansichtstyp das entsprechende Konzept modelliert.

concat_view kann common_range sein, wenn der letzte zugrunde liegende Bereich common_range modelliert.

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 ranges::view_interface
gibt zurück, ob die abgeleitete View leer ist, nur verfügbar wenn sie sized_range oder forward_range
erfüllt (öffentliche Mitgliedsfunktion von std::ranges::view_interface<D>)
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(öffentliche Mitgliedsfunktion von std::ranges::view_interface<D>)
(C++23)
gibt einen Sentinel für den konstanten Iterator des Bereichs zurück
(öffentliche Mitgliedsfunktion von std::ranges::view_interface<D>)
gibt zurück, ob die abgeleitete View nicht leer ist, nur verfügbar wenn ranges::empty darauf anwendbar ist
(öffentliche Mitgliedsfunktion von std::ranges::view_interface<D>)
gibt das erste Element in der abgeleiteten View zurück, verfügbar wenn sie forward_range
erfüllt (öffentliche Mitgliedsfunktion von std::ranges::view_interface<D>)
gibt das letzte Element in der abgeleiteten View zurück, nur verfügbar wenn sie bidirectional_range und common_range
erfüllt (öffentliche Mitgliedsfunktion von std::ranges::view_interface<D>)
gibt das nte Element in der abgeleiteten View zurück, nur verfügbar wenn sie random_access_range
erfüllt (öffentliche Mitgliedsfunktion 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

#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)