Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
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 /* non spécifié */ concat = /* non spécifié */ ;

}
(2) (depuis C++26)
Signature d'appel
template < ranges:: viewable_range ... Rs >

requires /* voir ci-dessous */

constexpr ranges:: view auto concat ( Rs && ... rs ) ;
(depuis C++26)
Alias de types d'assistance
template < class ... Rs >

using /*concat-reference-t*/ =

ranges:: common_reference_t < ranges:: range_reference_t < Rs > ... > ;
(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*/ =

ranges:: common_reference_t < ranges:: range_rvalue_reference_t < Rs > ... > ;
(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.

1) Le modèle de classe avec un paramètre de modèle qui est un pack non vide de view s dont chacun modélise au moins input_range et est concatable (7) .
2) 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.
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 sous-jacent soit convertible en ranges:: common_reference_t .
4) Le 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.
5) La référence rvalue qui prend également correctement en charge les cas où les itérateurs sous-jacents personnalisent iter_move .
6) Définit le concept indirectly-readable pour l' iterator afin que concat_view puisse modéliser input_range .
Équivalent à :
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>> && ...);
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 plages différentes peuvent être adaptées en une séquence qui elle-même modélise une plage. É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 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

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)