std::ranges::views::lazy_split, std::ranges::lazy_split_view
Definido en el archivo de encabezado <ranges> | ||
template<ranges::input_range V, ranges::forward_range Pattern > requires ranges::view<V>&&ranges::view<Pattern>&& | (1) | (desde C++20) |
namespace views { inlineconstexpr/*no especificado*/ lazy_split =/*no especificado*/; | (2) | (desde C++20) |
Signatura de la llamada | ||
template<ranges::viewable_range R, class Pattern > requires /* véase a continuación */ | (desde C++20) | |
template<class Pattern > constexpr/*cierre de adaptador de rango*/ lazy_split( Pattern&& pattern ); | (desde C++20) | |
Conceptos auxiliares | ||
template<class R > concept /*rango_diminuto*/= // solo exposición | (3) | (desde C++20) |
lazy_split_view
toma una vista (view
) y un delimitador, y parte la vista en subrangos en el delimitador. Se apoyan dos escenarios principales:
- La vista es un
input_range
, el delimitador es un solo elemento (envuelto en una vistasingle_view
). - La vista es un
forward_range
, el delimitador es una vista de elementos.
sized_range
, Pattern::size() es una expresión constante y adecuada como un argumento de plantilla de no tipo, y el valor de Pattern::size() es menor que 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 vista subyacente V
modela los conceptos respectivos, 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 vista subyacente V
modela los conceptos respectivos. No modela common_range
, y no puede usarse con algoritmos que esperan un bidirectional_range
o más alto.
Contenido |
[editar]Datos miembro
Las implementaciones típicas de lazy_split_view
mantienen dos o tres datos miembro no estáticos:
- la vista subyacente de tipo
V
(que se muestra aquí comobase_
solo de exposición), - el patrón (que se muestra aquí como
pattern_
solo de exposición) que se utiliza como delimitador para dividir la vista subyacente, y - el objeto almacenador en caché (que se muestra aquí como
current_
solo de exposición) del tipo solo de exposición similar astd::optional/*no_propagador_de_caché*/<ranges::iterator_t<V>>.current_
almacena en caché el resultado de las llamadas abegin()
. Está presente solo siV
no satisfaceforward_range
.
[editar]Funciones miembro
(C++20) | Construye un objeto lazy_split_view (función miembro pública) |
(C++20) | Devuelve una copia de la vista (adaptada) subyacente. (función miembro pública) |
(C++20) | Devuelve un iterador al comienzo. (función miembro pública) |
(C++20) | Devuelve un iterador o un centinela al final. (función miembro pública) |
Heredadas de std::ranges::view_interface | |
(C++20) | Devuelve si la vista derivada está vacía o no. Se proporciona si la vista derivada satisface forward_range . (función miembro pública de std::ranges::view_interface<D> ) |
(C++20) | Devuelve si la vista derivada está vacía o no. Se proporciona si ranges::empty le es aplicable. (función miembro pública de std::ranges::view_interface<D> ) |
(C++20) | Devuelve el primer elemento en la vista derivada. Se proporciona si la vista derivada satisface forward_range . (función miembro pública de std::ranges::view_interface<D> ) |
[editar]Clases anidadas
(C++20) | El tipo iterador. (plantilla de clase miembro de solo exposición) |
(C++20) | El tipo centinela del rango interno. (plantilla de clase miembro de solo exposición) |
[editar]Guías de deducción
[editar]Notas
lazy_split_view
se introdujo por el informe de defecto P2210R2 posterior a C++20. Tiene el mismo mecanismo perezoso que el de la vista split_view
antigua antes del cambio.
[editar]Ejemplo
#include <algorithm>#include <iostream>#include <ranges>#include <string_view> // P2210R2: un parche temporal hasta que se use g++ en línea >= 12#define lazy_split_view split_view#define lazy_split split auto imprimir =[](autoconst& view){// `view` es una vista std::views::lazy_split_view::/*outer_iterator*/::value_type for(std::cout<<"{ ";constauto elemento : view)std::cout<< elemento <<' ';std::cout<<"} ";}; int main(){constexprstaticauto fuente ={0, 1,0, 2,3,0, 4,5,6,0, 7,8,9};constexprint delimitador {0};constexpr std::ranges::lazy_split_view vista_externa{fuente, delimitador};std::cout<<"divisiones["<< std::ranges::distance(vista_externa)<<"]: ";for(autoconst& vista_interna: vista_externa) imprimir(vista_interna); constexprstd::string_view hola {"Hola C++ 20 !"};std::cout<<"\n""subcadenas: "; std::ranges::for_each(hola | std::views::lazy_split(' '), imprimir); constexprstd::string_view texto {"Hola-+-C++-+-20-+-!"};constexprstd::string_view delim {"-+-"};std::cout<<"\n""subcadenas: "; std::ranges::for_each(texto | std::views::lazy_split(delim), imprimir);}
Salida:
divisiones[5]: { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 } subcadenas: { H o l a } { C + + } { 2 0 } { ! } subcadenas: { H o l a } { C + + } { 2 0 } { ! }
[editar]Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
P2210R2 | C++20 | La vista split_view antigua era demasiado perezosa para usarse fácilmente. | Mueve su funcionalidad a lazy_split_view |
[editar]Véase también
Una vista (view ) sobre los subrangos obtenidos al dividir otra vista usando un delimitador. (plantilla de clase)(objeto adaptador de rango) | |
(C++20) | Una vista (view ) que consiste en la secuencia obtenida al aplanar una vista de rangos (range ). (plantilla de clase)(objeto adaptador de rango) |