Namespaces
Variants

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

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rangos
 
 
Definido en el 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> || /*tiny-range*/<Pattern>)
class lazy_split_view
    : public ranges::view_interface<lazy_split_view<V, Pattern>>
(1) (desde C++20)
namespace views {
    inline constexpr /* unspecified */ lazy_split = /* unspecified */;
}
(2) (desde C++20)
Firma de llamada
template< ranges::viewable_range R, class Pattern >
    requires /* see below */
constexpr ranges::view auto lazy_split( R&& r, Pattern&& pattern );
(desde C++20)
template< class Pattern >
constexpr /* range adaptor closure */ lazy_split( Pattern&& pattern );
(desde C++20)
Conceptos auxiliares
template< class R >
concept /*tiny-range*/ =
    ranges::sized_range<R> &&
    requires { /* is-statically-constexpr-sized */<R>; } &&
    (std::remove_reference_t<R>::size() <= 1);
(3) (solo exposición*)
1) lazy_split_view toma una vista y un delimitador, y divide la vista en subrangos en el delimitador.

Se admiten dos escenarios principales:

2) Un RangeAdaptorObject. La expresión views::lazy_split(e, f) es equivalente a expresión a lazy_split_view(e, f).
3) El concepto de solo exposición /*tiny-range*/<Pattern> se satisface si Pattern satisface sized_range, Pattern::size() es una expresión constante y adecuada como argumento no tipo de plantilla, y el valor de Pattern::size() es menor o igual que 1. Notablemente, empty_view y single_view satisfacen este concepto.

lazy_split_view modela los conceptos forward_range e input_range cuando la vista V subyacente 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 e input_range cuando la vista V subyacente modela los conceptos respectivos. No modela common_range, y no se puede usar con algoritmos que esperan un bidirectional_range o superior.

A diferencia de split_view, lazy_split_view no mantiene la continuidad del subrango.

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 ranges::view_interface
devuelve si la vista derivada está vacía, solo si cumple con 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, 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, si cumple con 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)