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) &&
/*concatable*/<Views...>
class concat_view
: public ranges::view_interface<concat_view<Views...>>
|
(1) | (depuis C++26) |
namespace views {
inline constexpr /* unspecified */ concat = /* unspecified */;
}
|
(2) | (depuis C++26) |
| Signature d'appel |
||
template< ranges::viewable_range... Rs >
requires /* see below */
constexpr ranges::view auto concat( Rs&&... rs );
|
(depuis C++26) | |
| Alias de type auxiliaires |
||
template< class... Rs >
using /*concat-reference-t*/ =
ranges::common_reference_t<ranges::range_reference_t<Rs>...>;
|
(3) | (uniquement à titre d'exposition*) |
template< class... Rs >
using /*concat-value-t*/ = std::common_type_t<ranges::range_value_t<Rs>...>;
|
(4) | (uniquement à titre d'exposition*) |
template< class... Rs >
using /*concat-rvalue-reference-t*/ =
ranges::common_reference_t<ranges::range_rvalue_reference_t<Rs>...>;
|
(5) | (uniquement à titre d'exposition*) |
| Concepts auxiliaires |
||
template< class Ref, class RRef, class It >
concept /*concat-indirectly-readable-impl*/ = /* see description */;
|
(6) | (uniquement à titre d'exposition*) |
template< class... Rs >
concept /*concatable*/ = /* see description */;
|
(7) | (uniquement à titre d'exposition*) |
concat_view présente une view factory qui prend un nombre arbitraire de séquences comme liste d'arguments, et fournit une vue qui commence au premier élément de la première séquence, se termine au dernier élément de la dernière séquence, avec tous les éléments des séquences ordonnés entre eux respectivement dans l'ordre donné dans les arguments, concaténant ou enchaînant efficacement les séquences d'arguments.
concatable (7).views::concat est un objet point de personnalisation.
Étant donné un paquet de sous-expressions exprs, l'expression views::concat(exprs...) est équivalent à une expression à
views::all(exprs...)siexprsest un paquet avec un seul élément dont le type modélise input_range,concat_view(exprs...)sinon.
ranges::range_reference_t de la séquence sous-jacente est convertible en ranges::common_reference_t.iterator::value_type qui respecte en outre les value_type des séquences sous-jacentes pour supporter les cas où les séquences sous-jacentes ont des itérateurs proxy.iter_move.indirectly-readable pour iterator afin que concat_view puisse modéliser input_range.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*/ est 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 vue adapté modélise le concept correspondant.
concat_view peut être common_range si la dernière séquence sous-jacente modélise common_range.
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 ranges::view_interface | |
| retourne si la vue dérivée est vide, à condition qu'elle satisfasse 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>)
|
| retourne si la vue dérivée n'est pas vide, à condition que ranges::empty lui soit applicable (fonction membre publique de std::ranges::view_interface<D>)
| |
| retourne le premier élément de la vue dérivée, à condition qu'elle satisfasse forward_range (fonction membre publique de std::ranges::view_interface<D>)
| |
| retourne le dernier élément de la vue dérivée, à condition qu'elle satisfasse bidirectional_range et common_range (fonction membre publique de std::ranges::view_interface<D>)
| |
retourne le ne élément de la vue dérivée, à condition qu'elle satisfasse 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
#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) |