std::ranges::views::chunk, std::ranges::chunk_view
| Definido en el encabezado <ranges>
|
||
template< ranges::view V >
requires ranges::input_range<V>
class chunk_view
: public ranges::view_interface<chunk_view<V>>
|
(1) | (desde C++23) |
template< ranges::view V >
requires ranges::forward_range<V>
class chunk_view<V>
: public ranges::view_interface<chunk_view<V>>
|
(2) | (desde C++23) |
namespace views {
inline constexpr /* unspecified */ chunk = /* unspecified */;
}
|
(3) | (desde C++23) |
| Firma de llamada |
||
template< ranges::viewable_range R >
constexpr ranges::view auto chunk( R&& r, ranges::range_difference_t<R> n );
|
(desde C++23) | |
template< class DifferenceType >
constexpr /*range adaptor closure*/ chunk( DifferenceType&& n );
|
(desde C++23) | |
| Plantillas auxiliares |
||
template< class I >
constexpr I /*div-ceil*/( I num, I denom );
|
(4) | (solo exposición*) |
chunk_view toma una view y un número n y produce un rango de vistas (los fragmentos ) de la vista original, de modo que cada fragmento , excepto quizás el último, tenga el tamaño n. Estos fragmentos son sub-rangos sucesivos no superpuestos de los elementos de la vista original, en orden.
Sea s el tamaño de la vista original. Si s no es múltiplo de n, el tamaño de la última vista producida es exactamente s % n (el resto). De lo contrario, el tamaño de cada fragmento , incluido el último, es n.
El tamaño de la vista producida es /*div-ceil*/(s).
Si n no es mayor que 0, el comportamiento no está definido.
V que modela forward_range o más fuerte. Modela common_range si la vista subyacente V es forward_range, common_range, y ya sea sized_range o no bidirectional_range.views::chunk denota un RangeAdaptorObject. Dadas las subexpresiones e y n, la expresión views::chunk(e, n) es equivalente en expresión a chunk_view(e, n).num por denom. Equivalente a:
I r = num / denom;
if (num % denom)
++r;
return r;
Miembros de datos
| Miembro | Descripción |
V
base_
|
la vista subyacente
( objeto miembro solo para exposición* ) |
ranges::
range_difference_t
<
V
>
n_
|
el tamaño del "fragmento"
( objeto miembro solo para exposición* ) |
Si
|
|
ranges::
range_difference_t
<
V
>
remainder_
(condicionalmente presente) |
el número de elementos restantes en el "fragmento" actual
( objeto miembro solo para exposición* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
current_
(condicionalmente presente) |
un objeto que almacena en caché el iterador subyacente actual
( objeto miembro solo para exposición* ) |
Funciones miembro
construye un
chunk_view
(función miembro pública) |
|
|
devuelve una copia de la vista subyacente (adaptada)
(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) |
|
|
(C++26)
|
devuelve el tamaño aproximado del
approximately_sized_range
resultante
(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, siempre que satisfaga 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 nésimo 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
|
(C++23)
|
el tipo de iterador de salida ("por fragmentos") cuando
V
modela
input_range
(
1
)
( clase miembro solo para exposición* ) |
|
(C++23)
|
el tipo de iterador interno ("por elementos") cuando
V
modela
input_range
(
1
)
( clase miembro solo para exposición* ) |
|
(C++23)
|
el tipo de iterador cuando
V
modela
forward_range
(
2
)
( plantilla de clase miembro solo para exposición* ) |
Plantillas auxiliares
|
template
<
class
V
>
constexpr
bool
ranges::
enable_borrowed_range
<
chunk_view
<
V
>>
=
|
(desde C++23) | |
Esta especialización de
ranges::enable_borrowed_range
hace que
chunk_view
satisfaga
borrowed_range
cuando la vista subyacente
V
satisface tanto
forward_range
como
borrowed_range
.
Notas
Si
V
modela
input_range
(
1
)
,
chunk_view
tiene un tipo de iterador dedicado:
outer_iterator::value_type
que es en sí mismo una vista de entrada.
Si
V
modela
forward_range
o más fuerte
(
2
)
,
chunk_view
delega en
views::take
para su
value_type
.
Si
V
modela
bidirectional_range
o rangos más potentes
(
2
)
, la necesidad de calcular el tamaño del último fragmento correctamente (desde el iterador final
iterator
) requiere que el tipo de rango subyacente
V
sea
sized_range
.
| Macro de prueba de características | Valor | Estándar | Característica |
|---|---|---|---|
__cpp_lib_ranges_chunk
|
202202L
|
(C++23) |
std::ranges::chunk_view
|
Ejemplo
#include <algorithm> #include <initializer_list> #include <iostream> #include <ranges> auto print_subrange = [](std::ranges::viewable_range auto&& r) { std::cout << '['; for (int pos{}; auto elem : r) std::cout << (pos++ ? " " : "") << elem; std::cout << "] "; }; int main() { const auto v = {1, 2, 3, 4, 5, 6}; for (const unsigned width : std::views::iota(1U, 2U + v.size())) { auto const chunks = v | std::views::chunk(width); std::cout << "chunk(" << width << "): "; std::ranges::for_each(chunks, print_subrange); std::cout << '\n'; } }
Salida:
chunk(1): [1] [2] [3] [4] [5] [6] chunk(2): [1 2] [3 4] [5 6] chunk(3): [1 2 3] [4 5 6] chunk(4): [1 2 3 4] [5 6] chunk(5): [1 2 3 4 5] [6] chunk(6): [1 2 3 4 5 6] chunk(7): [1 2 3 4 5 6]
Referencias
- Estándar C++23 (ISO/IEC 14882:2024):
-
- 26.7.28 Vista de fragmentos [range.chunk]
Véase también
divide la
view
en subrangos entre cada par de elementos adyacentes para los cuales el predicado dado devuelve
false
(plantilla de clase) (objeto adaptador de rango) |
|
una
view
que consiste en tuplas de referencias a elementos adyacentes de la vista adaptada
(plantilla de clase) (objeto adaptador de rango) |
|
|
(C++23)
|
una
view
cuyo M-ésimo elemento es una
view
sobre los elementos M-ésimo a (M + N - 1)-ésimo de otra
view
(plantilla de clase) (objeto adaptador de rango) |