std::ranges:: views:: concat, std::ranges:: concat_view
|
Défini dans l'en-tête
<ranges>
|
||
|
template
<
ranges::
input_range
...
Views
>
requires
(
ranges::
view
<
Views
>
&&
...
)
&&
(
sizeof...
(
Views
)
>
0
)
&&
|
(1) | (depuis C++26) |
|
namespace
views
{
inline
constexpr
/* non spécifié */
concat
=
/* non spécifié */
;
|
(2) | (depuis C++26) |
|
Signature d'appel
|
||
|
template
<
ranges::
viewable_range
...
Rs
>
requires
/* voir ci-dessous */
|
(depuis C++26) | |
|
Alias de types d'assistance
|
||
|
template
<
class
...
Rs
>
using
/*concat-reference-t*/
=
|
(3) | ( exposition uniquement* ) |
|
template
<
class
...
Rs
>
using /*concat-value-t*/ = std:: common_type_t < ranges:: range_value_t < Rs > ... > ; |
(4) | ( exposition uniquement* ) |
|
template
<
class
...
Rs
>
using
/*concat-rvalue-reference-t*/
=
|
(5) | ( exposition uniquement* ) |
|
Concepts auxiliaires
|
||
|
template
<
class
Ref,
class
RRef,
class
It
>
concept /*concat-indirectly-readable-impl*/ = /* voir description */ ; |
(6) | ( exposition uniquement* ) |
|
template
<
class
...
Rs
>
concept /*concatable*/ = /* voir description */ ; |
(7) | ( exposition uniquement* ) |
concat_view
présente une
view
factory qui prend un nombre arbitraire de plages comme liste d'arguments, et fournit une vue qui commence au premier élément de la première plage, se termine au dernier élément de la dernière plage, avec tous les éléments des plages séquencés entre eux respectivement dans l'ordre donné dans les arguments, concaténant effectivement, ou chaînant ensemble les plages d'arguments.
view
s
dont chacun modélise au moins
input_range
et est
concatable
(7)
.
views::concat
est un objet de point de personnalisation.
Étant donné un pack de sous-expressions exprs , l'expression views :: concat ( exprs... ) est équivalente en expression à
-
views::
all
(
exprs...
)
si
exprs
est un pack avec un seul élément dont le type modélise
input_range, - concat_view ( exprs... ) sinon.
iterator
::value_type
qui respecte en outre le
value_type
des gammes sous-jacentes pour prendre en charge les cas où les gammes sous-jacentes ont des itérateurs proxy.
iter_move
.
indirectly-readable
pour l'
iterator
afin que
concat_view
puisse modéliser
input_range
.
template< class... Rs > concept /*concat-indirectly-readable*/ = // exposition uniquement 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
modélise toujours
input_range
, et modélise
forward_range
,
bidirectional_range
,
random_access_range
, ou
sized_range
si chaque type de
view
adapté modélise le concept correspondant.
concat_view
peut être une
common_range
si la dernière plage sous-jacente modélise
common_range
.
Table des matières |
Objets de point de personnalisation
Le nom
views::concat
désigne un
objet de point de personnalisation
, qui est un
objet fonction
constant d'un type de classe
littéral
semiregular
. Voir
CustomizationPointObject
pour plus de détails.
Membres de données
| Membre | Description |
std::
tuple
<
Views...
>
views_
|
tous les objets de vue adaptés
( membre objet d'exposition uniquement* ) |
Fonctions membres
construit un
concat_view
(fonction membre publique) |
|
|
retourne un itérateur vers le début
(fonction membre publique) |
|
|
retourne un itérateur ou un sentinelle vers la fin
(fonction membre publique) |
|
retourne le nombre d'éléments, fourni uniquement si la plage sous-jacente (adaptée) satisfait
sized_range
(fonction membre publique) |
|
Hérité de std::ranges::view_interface |
|
indique si la vue dérivée est vide, fourni uniquement si elle satisfait
sized_range
ou
forward_range
(fonction membre publique de
std::ranges::view_interface<D>
)
|
|
|
(C++23)
|
retourne un itérateur constant vers le début de la plage
(fonction membre publique de
std::ranges::view_interface<D>
)
|
|
(C++23)
|
retourne un sentinelle pour l'itérateur constant de la plage
(fonction membre publique de
std::ranges::view_interface<D>
)
|
|
indique si la vue dérivée n'est pas vide, fourni uniquement si
ranges::empty
lui est applicable
(fonction membre publique de
std::ranges::view_interface<D>
)
|
|
retourne le premier élément de la vue dérivée, fourni si elle satisfait
forward_range
(fonction membre publique de
std::ranges::view_interface<D>
)
|
|
retourne le dernier élément de la vue dérivée, fourni uniquement si elle satisfait
bidirectional_range
et
common_range
(fonction membre publique de
std::ranges::view_interface<D>
)
|
|
retourne le
n
ème
élément de la vue dérivée, fourni uniquement si elle satisfait
random_access_range
(fonction membre publique de
std::ranges::view_interface<D>
)
|
|
Guides de déduction
Classes imbriquées
| Nom de la classe | Définition |
|
le type d'itérateur
( classe membre template* à titre d'exposition uniquement ) |
Modèles d'assistance
Il n'y a pas de spécialisation de
ranges::
enable_borrowed_range
pour
concat_view
, car cela nécessiterait que l'implémentation de l'itérateur contienne une copie de tous les itérateurs et sentinelles de toutes les plages sous-jacentes à tout moment.
Notes
Aucun argument
views
::
concat
(
)
est mal formé, car il n'existe aucune manière raisonnable de déterminer un type d'élément
T
. Un seul argument
views
::
concat
(
r
)
est une expression équivalente à
views::
all
(
r
)
.
| Macro de test de fonctionnalité | Valeur | Norme | Fonctionnalité |
|---|---|---|---|
__cpp_lib_ranges_concat
|
202403L
|
(C++26) |
std::ranges::concat_view
|
Exemple
La version préliminaire peut être consultée sur Compiler Explorer .
#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[] }
Sortie :
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]
Références
- Norme C++26 (ISO/CEI 14882:2026) :
-
- 26.7.18 Vue de concaténation [range.concat]
Voir aussi
|
(C++20)
|
une
view
constituée de la séquence obtenue en aplatissant une
view
de
range
s
(modèle de classe) (objet adaptateur de gamme) |
une
view
constituée de la séquence obtenue en aplatissant une vue de gammes, avec le délimiteur entre les éléments
(modèle de classe) (objet adaptateur de gamme) |
|
|
(C++23)
|
une
view
constituée de tuples de références aux éléments correspondants des vues adaptées
(modèle de classe) (objet point de personnalisation) |
une
view
constituée de tuples de résultats calculés par le produit cartésien n-aire des vues adaptées
(modèle de classe) (objet point de personnalisation) |