std::ranges::views::concat, std::ranges::concat_view
| 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.
concatable (7) erfüllt.views::concat ist ein Anpassungspunktobjekt.
Gegeben ein Paket von Unterausdrücken exprs, ist der Ausdruck views::concat(exprs...) ausdrucksäquivalent zu
views::all(exprs...)fallsexprsein Paket mit nur einem Element ist, dessen Typ input_range modelliert,concat_view(exprs...)andernfalls.
ranges::range_reference_t der zugrunde liegenden Bereiche in ranges::common_reference_t konvertierbar ist.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.iter_move anpassen.indirectly-readable-Konzept für die iterator, sodass 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>> && ...);
/*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>;
};
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
|
(C++20)
|
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) |
|
|
(C++23)
|
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) |