Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <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) (desde C++26)
namespace views {

inline constexpr /* no especificado */ concat = /* no especificado */ ;

}
(2) (desde C++26)
Firma de llamada
template < ranges:: viewable_range ... Rs >

requires /* ver más abajo */

constexpr ranges:: view auto concat ( Rs && ... rs ) ;
(desde C++26)
Alias de tipos auxiliares
template < class ... Rs >

using /*concat-reference-t*/ =

ranges:: common_reference_t < ranges:: range_reference_t < Rs > ... > ;
(3) ( solo para exposición* )
template < class ... Rs >
using /*concat-value-t*/ = std:: common_type_t < ranges:: range_value_t < Rs > ... > ;
(4) ( solo para exposición* )
template < class ... Rs >

using /*concat-rvalue-reference-t*/ =

ranges:: common_reference_t < ranges:: range_rvalue_reference_t < Rs > ... > ;
(5) ( solo para exposición* )
Conceptos auxiliares
template < class Ref, class RRef, class It >
concept /*concat-indirectly-readable-impl*/ = /* ver descripción */ ;
(6) ( solo para exposición* )
template < class ... Rs >
concept /*concatable*/ = /* ver descripción */ ;
(7) ( solo para exposición* )

concat_view presenta una view factory que toma un número arbitrario de rangos como lista de argumentos, y proporciona una vista que comienza en el primer elemento del primer rango, termina en el último elemento del último rango, con todos los elementos de los rangos secuenciados entre medio respectivamente en el orden dado en los argumentos, concatenando efectivamente, o encadenando juntos los rangos argumento.

1) La plantilla de clase con un parámetro de plantilla que es un paquete no vacío de view s cada uno de los cuales modela al menos input_range y es concatable (7) .
2) views::concat es un objeto de punto de personalización.

Dado un paquete de subexpresiones exprs , la expresión views :: concat ( exprs... ) es equivalente-expresión a

  • views:: all ( exprs... ) si exprs es un paquete con solo un elemento cuyo tipo modela input_range ,
  • concat_view ( exprs... ) en caso contrario.
3) Representa el tipo de referencia. Se necesita una restricción adicional para asegurar que cada ranges:: range_reference_t del rango subyacente sea convertible a ranges:: common_reference_t .
4) El iterator ::value_type que adicionalmente respeta los value_type de los rangos subyacentes para soportar los casos cuando los rangos subyacentes tienen iteradores proxy.
5) La referencia de valor derecho que también admite correctamente los casos donde los iteradores subyacentes personalizan iter_move .
6) Define el concepto indirectly-readable para el iterator de modo que concat_view pueda modelar input_range .
Equivalente a:
template< class... Rs >
concept /*concat-indirectly-readable*/ = // solo para exposición
    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>> && ...);
donde el concepto solo de exposición /*concat-indirectly-readable-impl*/ es
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) Determina si dos o más rangos diferentes pueden adaptarse en una secuencia que a su vez modele un rango. Equivalente a:
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 siempre modela input_range , y modela forward_range , bidirectional_range , random_access_range , o sized_range si cada tipo de view adaptado modela el concepto correspondiente.

concat_view puede ser common_range si el último rango subyacente modela common_range .

Contenidos

Objetos de punto de personalización

El nombre views::concat denota un objeto de punto de personalización , que es un objeto función constante de un tipo de clase literal semiregular . Consulte CustomizationPointObject para más detalles.

Miembros de datos

Miembro Descripción
std:: tuple < Views... > views_ todos los objetos de vista adaptados
( miembro objeto solo para exposición* )

Funciones miembro

construye un concat_view
(función miembro pública)
devuelve un iterador al inicio
(función miembro pública)
devuelve un iterador o un centinela al final
(función miembro pública)
devuelve el número de elementos, proporcionado solo si el rango subyacente (adaptado) satisface sized_range
(función miembro pública)
Heredado de std::ranges::view_interface
devuelve si la vista derivada está vacía, proporcionado solo si satisface sized_range o forward_range
(función miembro pública de std::ranges::view_interface<D> )
(C++23)
devuelve un iterador constante al inicio del rango
(función miembro pública de std::ranges::view_interface<D> )
(C++23)
devuelve un centinela para el iterador constante del rango
(función miembro pública de std::ranges::view_interface<D> )
devuelve si la vista derivada no está vacía, proporcionado solo si ranges::empty es aplicable a ella
(función miembro pública de std::ranges::view_interface<D> )
devuelve el primer elemento en la vista derivada, proporcionado si satisface forward_range
(función miembro pública de std::ranges::view_interface<D> )
devuelve el último elemento en la vista derivada, proporcionado solo si satisface bidirectional_range y common_range
(función miembro pública de std::ranges::view_interface<D> )
devuelve el n ésimo elemento en la vista derivada, proporcionado solo si satisface random_access_range
(función miembro pública de std::ranges::view_interface<D> )

Guías de deducción

Clases anidadas

Nombre de la clase Definición
el tipo de iterador
( clase de miembro solo para exposición* )

Plantillas auxiliares

No existe una especialización de ranges:: enable_borrowed_range para concat_view , porque esto requeriría que la implementación del iterador contuviera una copia de todos los iteradores y centinelas de todos los rangos subyacentes en todo momento.

Notas

Sin argumentos views :: concat ( ) está mal formado, porque no existe una forma razonable de determinar un tipo de elemento T . Con un solo argumento views :: concat ( r ) es una expresión equivalente a views:: all ( r ) .

Macro de prueba de características Valor Std Característica
__cpp_lib_ranges_concat 202403L (C++26) std::ranges::concat_view

Ejemplo

La versión preliminar se puede consultar en 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[]
}

Salida:

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]

Referencias

  • Estándar C++26 (ISO/IEC 14882:2026):
  • 26.7.18 Vista de concatenación [range.concat]

Véase también

una view que consiste en la secuencia obtenida al aplanar una view de range s
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en la secuencia obtenida al aplanar una view de ranges, con el delimitador entre elementos
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en tuplas de referencias a elementos correspondientes de las views adaptadas
(plantilla de clase) (objeto punto de personalización)
una view que consiste en tuplas de resultados calculados por el producto cartesiano n-ario de las views adaptadas
(plantilla de clase) (objeto punto de personalización)