Espacios de nombres
Variantes

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

De cppreference.com
 
 
Biblioteca de rangos
Adaptadores de rangos
 
 
<tbody> </tbody>
Definido en el archivo de encabezado <ranges>
template< ranges::input_range V, ranges::forward_range Pattern > requires ranges::view<V> && ranges::view<Pattern> && std::indirectly_comparable<ranges::iterator_t<V>, ranges::iterator_t<Pattern>, ranges::equal_to> && (ranges::forward_range<V> || /*rango_diminuto*/<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)
Signatura de la llamada
template< ranges::viewable_range R, class Pattern > requires /* véase a continuación */ constexpr ranges::view auto lazy_split( R&& r, Pattern&& pattern );
(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 ranges::sized_range<R> && requires /*tiene-un-tamaño-constexpr-estático*/<R> && (std::remove_reference_t<R>::size() <= 1);
(3) (desde C++20)
1) lazy_split_view toma una vista (view) y un delimitador, y parte la vista en subrangos en el delimitador.

Se apoyan dos escenarios principales:

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

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í como base_ 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 a std::optional /*no_propagador_de_caché*/<ranges::iterator_t<V>>. current_ almacena en caché el resultado de las llamadas a begin(). Está presente solo si V no satisface forward_range.

Funciones miembro

Construye un objeto lazy_split_view
(función miembro pública) [editar]
(C++20)
Devuelve una copia de la vista (adaptada) subyacente.
(función miembro pública) [editar]
(C++20)
Devuelve un iterador al comienzo.
(función miembro pública) [editar]
(C++20)
Devuelve un iterador o un centinela al final.
(función miembro pública) [editar]
Heredadas de 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>) [editar]
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>) [editar]
(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

El tipo iterador.
(plantilla de clase miembro de solo exposición)
El tipo centinela del rango interno.
(plantilla de clase miembro de solo exposición)

Guías de deducción

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.

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 = [](auto const& view)
{
    // `view` es una vista std::views::lazy_split_view::/*outer_iterator*/::value_type

    for (std::cout << "{ "; const auto elemento : view)
        std::cout << elemento << ' ';
    std::cout << "} ";
};

int main()
{
    constexpr static auto fuente = { 0, 1,0, 2,3,0, 4,5,6,0, 7,8,9 };
    constexpr int delimitador {0};
    constexpr std::ranges::lazy_split_view vista_externa{fuente, delimitador};
    std::cout << "divisiones[" << std::ranges::distance(vista_externa) << "]:  ";
    for (auto const& vista_interna: vista_externa)
        imprimir(vista_interna);

    constexpr std::string_view hola { "Hola C++ 20 !" };
    std::cout << "\n" "subcadenas:     ";
    std::ranges::for_each(hola | std::views::lazy_split(' '), imprimir);

    constexpr std::string_view texto { "Hola-+-C++-+-20-+-!" };
    constexpr std::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 } { ! }

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

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) [editar]
Una vista (view) que consiste en la secuencia obtenida al aplanar una vista de rangos (range).
(plantilla de clase) (objeto adaptador de rango) [editar]