std::ranges:: views:: concat, std::ranges:: concat_view
|
Definido en el encabezado
<ranges>
|
||
|
template
<
ranges::
input_range
...
Views
>
requires
(
ranges::
view
<
Views
>
&&
...
)
&&
(
sizeof...
(
Views
)
>
0
)
&&
|
(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 */
|
(desde C++26) | |
|
Alias de tipos auxiliares
|
||
|
template
<
class
...
Rs
>
using
/*concat-reference-t*/
=
|
(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*/
=
|
(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.
view
s
cada uno de los cuales modela al menos
input_range
y es
concatable
(7)
.
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.
iterator
::value_type
que adicionalmente respeta los
value_type
de los rangos subyacentes para soportar los casos cuando los rangos subyacentes tienen iteradores proxy.
iter_move
.
indirectly-readable
para el
iterator
de modo que
concat_view
pueda modelar
input_range
.
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>> && ...);
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
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
|
(C++20)
|
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) |
|
|
(C++23)
|
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) |