std::ranges:: views:: chunk, std::ranges:: chunk_view
|
Definido en el encabezado
<ranges>
|
||
|
template
<
ranges::
view
V
>
requires
ranges::
input_range
<
V
>
|
(1) | (desde C++23) |
|
template
<
ranges::
view
V
>
requires
ranges::
forward_range
<
V
>
|
(2) | (desde C++23) |
|
namespace
views
{
inline
constexpr
/* no especificado */
chunk
=
/* no especificado */
;
|
(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 /*adaptador de rango de cierre*/ chunk ( DifferenceType && n ) ; |
(desde C++23) | |
|
Plantillas auxiliares
|
||
|
template
<
class
I
>
constexpr I /*div-ceil*/ ( I num, I denom ) ; |
(4) | ( solo para exposición* ) |
chunk_view
toma una
view
y un número
n
y produce un rango de vistas (los
chunks
) de la vista original, de modo que cada
chunk
, excepto quizás el último, tiene el tamaño
n
. Estos
chunks
son sub-rangos no superpuestos y sucesivos 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 es indefinido.
V
que modela
forward_range
o superior. Modela
common_range
si la vista subyacente
V
es
forward_range
,
common_range
, y ya sea
sized_range
o no
bidirectional_range
.
I r = num / denom; if (num % denom) ++r; return r;
Contenidos |
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 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
|
(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) |