std::ranges:: views:: lazy_split, std::ranges:: lazy_split_view
|
Definido en el encabezado
<ranges>
|
||
|
template
<
ranges::
input_range
V,
ranges::
forward_range
Pattern
>
requiere
ranges::
view
<
V
>
&&
|
(1) | (desde C++20) |
|
namespace
views
{
inline
constexpr
/* no especificado */
lazy_split
=
/* no especificado */
;
|
(2) | (desde C++20) |
|
Firma de llamada
|
||
|
template
<
ranges::
viewable_range
R,
class
Pattern
>
requiere
/* ver más abajo */
|
(desde C++20) | |
|
template
<
class
Pattern
>
constexpr /* adaptador de rango de cierre */ lazy_split ( Pattern && pattern ) ; |
(desde C++20) | |
|
Conceptos auxiliares
|
||
|
template
<
class
R
>
concept
/*tiny-range*/
=
|
(3) | ( solo para exposición* ) |
lazy_split_view
toma una
view
y un delimitador, y divide la
view
en subrangos basándose en el delimitador.
Se admiten dos escenarios principales:
-
La view es un
input_range, el delimitador es un único elemento (envuelto en unasingle_view). -
La view es un
forward_range, el delimitador es unaviewde elementos.
Pattern
cumple con
sized_range
,
Pattern
::
size
(
)
es una expresión constante y adecuada como argumento de plantilla constante, y el valor de
Pattern
::
size
(
)
es menor o igual a
1
. Notablemente,
empty_view
y
single_view
satisfacen este concepto.
lazy_split_view
modela los conceptos
forward_range
y
input_range
cuando la
view
subyacente
V
modela los respectivos conceptos, y modela
common_range
cuando
V
modela tanto
forward_range
como
common_range
.
El rango interno (
ranges::
range_reference_t
<
lazy_split_view
>
) modela los conceptos
forward_range
y
input_range
cuando la
view
subyacente
V
modela los respectivos conceptos. No modela
common_range
, y no puede utilizarse con algoritmos que esperen un
bidirectional_range
o superior.
A diferencia de
split_view
,
lazy_split_view
no mantiene la continuidad del subrango.
Contenidos |
Miembros de datos
| Miembro | Descripción |
V
base_
(privado)
|
la vista subyacente
view
( objeto miembro solo para exposición* ) |
Pattern
pattern_
(privado)
|
el patrón que se utiliza como delimitador para dividir la vista subyacente
view
( objeto miembro solo para exposición* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
current_
(privado)
(presente solo si
V
no satisface
forward_range
)
|
un objeto que almacena en caché el resultado de las llamadas a
begin()
( objeto miembro solo para exposición* ) |
Funciones miembro
construye un
lazy_split_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) |
|
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>
)
|
|
Clases anidadas
|
el tipo de iterador
( clase de miembro de exposición solamente* ) |
|
|
el tipo de iterador del rango interno
( clase de miembro de exposición solamente* ) |
Guías de deducción
Notas
El nombre
lazy_split_view
es introducido por el reporte de defectos post-C++20
P2210R2
. Tiene el mismo mecanismo lazy que el antiguo
split_view
antes del cambio.
Ejemplo
#include <algorithm> #include <iostream> #include <ranges> #include <string_view> auto print = [](auto const& view) { // `view` es de tipo std::views::lazy_split_view::__outer_iterator::value_type for (std::cout << "{ "; const auto element : view) std::cout << element << ' '; std::cout << "} "; }; int main() { constexpr static auto source = {0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9}; constexpr int delimiter{0}; constexpr std::ranges::lazy_split_view outer_view{source, delimiter}; std::cout << "splits[" << std::ranges::distance(outer_view) << "]: "; for (auto const& inner_view: outer_view) print(inner_view); constexpr std::string_view hello{"Hello C++ 20 !"}; std::cout << "\n" "substrings: "; std::ranges::for_each(hello | std::views::lazy_split(' '), print); constexpr std::string_view text{"Hello-+-C++-+-20-+-!"}; constexpr std::string_view delim{"-+-"}; std::cout << "\n" "substrings: "; std::ranges::for_each(text | std::views::lazy_split(delim), print); }
Salida:
splits[5]: { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| P2210R2 | C++20 |
el antiguo
split_view
era demasiado perezoso para ser usado fácilmente
|
traslada su funcionalidad a
lazy_split_view
|
Véase también
|
(C++20)
|
una
view
sobre los subrangos obtenidos al dividir otra
view
usando un delimitador
(plantilla de clase) (objeto adaptador de rango) |
|
(C++20)
|
una
view
que consiste en la secuencia obtenida al aplanar una
view
de
range
s
(plantilla de clase) (objeto adaptador de rango) |