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) &&
/*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.
concatable (7).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...)siexprses un pack con solo un elemento cuyo tipo modela input_range,concat_view(exprs...)en caso contrario.
ranges::range_reference_t del rango subyacente se pueda convertir a ranges::common_reference_t.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.iter_move.indirectly-readable para el iterator de modo que concat_view pueda modelar input_range.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>> && ...);
/*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>;
};
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
|
(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) |