Namespaces
Variants

std::ranges:: views:: lazy_split, std::ranges:: lazy_split_view

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <ranges>
template < ranges:: input_range V, ranges:: forward_range Pattern >

requiere ranges:: view < V > &&
ranges:: view < Pattern > &&
std:: indirectly_comparable < ranges:: iterator_t < V > ,
ranges:: iterator_t < Pattern > ,
ranges:: equal_to > &&
( ranges:: forward_range < V > || /*tiny-range*/ < Pattern > )
class lazy_split_view

: public ranges:: view_interface < lazy_split_view < V, Pattern >>
(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 */

constexpr ranges:: view auto lazy_split ( R && r, Pattern && pattern ) ;
(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*/ =
ranges:: sized_range < R > &&
requiere { /* is-statically-constexpr-sized */ < R > ; } &&

( std:: remove_reference_t < R > :: size ( ) <= 1 ) ;
(3) ( solo para exposición* )
1) 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:

2) Un RangeAdaptorObject . La expresión views :: lazy_split ( e, f ) es equivalente-expresión a lazy_split_view ( e, f ) .
3) El concepto de solo exposición /*tiny-range*/ < Pattern > se satisface si 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

una view sobre los subrangos obtenidos al dividir otra view usando un delimitador
(plantilla de clase) (objeto adaptador de rango)
una view que consiste en la secuencia obtenida al aplanar una view de range s
(plantilla de clase) (objeto adaptador de rango)