Namespaces
Variants

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

Depuis fr.cppreference.net
 
 
Bibliothèque de ranges
Adaptateurs de ranges
 
 
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.

1) Le modèle de classe avec un paramètre de modèle qui est un paquet non vide de vues chacune modélisant au moins input_range et est concatable (7).
2) 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...) si exprs est un paquet avec un seul élément dont le type modélise input_range,
  • concat_view(exprs...) sinon.
3) Représente le type de référence. Une contrainte supplémentaire est nécessaire pour s'assurer que chaque ranges::range_reference_t de la séquence sous-jacente est convertible en ranges::common_reference_t.
4) Le 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.
5) La référence rvalue qui supporte également correctement les cas où les itérateurs sous-jacents personnalisent iter_move.
6) Définit le concept indirectly-readable pour iterator afin que concat_view puisse modéliser input_range.
Équivalent à :
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>> && ...);
où le concept d'exposition uniquement /*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>;
    };
7) Détermine si deux ou plusieurs séquences différentes peuvent être adaptées en une séquence qui modélise elle-même une séquence. Équivalent à :
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

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