Namespaces
Variants

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

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rangos
 
 
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 /* unspecified */ concat = /* unspecified */;
}
(2) (desde C++26)
Firma de llamada
template< ranges::viewable_range... Rs >
    requires /* see below */
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*/ = /* see description */;
(6) (solo para exposición*)
template< class... Rs >
concept /*concatable*/ = /* see description */;
(7) (solo para exposición*)

concat_view presenta una view fábrica 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 en medio respectivamente en el orden dado en los argumentos, concatenando efectivamente, o encadenando, los rangos de argumentos.

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

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

  • views::all(exprs...) si exprs es un pack 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 se pueda convertir a ranges::common_reference_t.
4) El iterator::value_type que además respeta los value_type de los rangos subyacentes para soportar los casos en que los rangos subyacentes tienen iteradores proxy.
5) La referencia de valor r que también soporta correctamente los casos en que 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*/ = // 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>> && ...);
donde el concepto de solo 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 se pueden adaptar en una secuencia que ella misma 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.

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 ranges::view_interface
devuelve si la vista derivada está vacía, 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, 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, si satisface forward_range
(función miembro pública de std::ranges::view_interface<D>)
devuelve el último elemento en la vista derivada, solo si satisface bidirectional_range y common_range
(función miembro pública de std::ranges::view_interface<D>)
devuelve el nth elemento en la vista derivada, 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

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