Namespaces
Variants

std::ranges:: views:: split, std::ranges:: split_view

From cppreference.net
Ranges library
Range adaptors
Definido en el encabezado <ranges>
template < ranges:: forward_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 >
class split_view

: public ranges:: view_interface < split_view < V, Pattern >>
(1) (desde C++20)
namespace views {

inline constexpr /* no especificado */ split = /* no especificado */ ;

}
(2) (desde C++20)
Firma de llamada
template < ranges:: viewable_range R, class Pattern >

requires /* ver más abajo */

constexpr ranges:: view auto split ( R && r, Pattern && pattern ) ;
(desde C++20)
template < class Pattern >
constexpr /* cierre adaptador de rango */ split ( Pattern && pattern ) ;
(desde C++20)
1) split_view toma una view y un delimitador, y divide la view en subrangos basándose en el delimitador.
2) RangeAdaptorObject . La expresión views :: split ( e, p ) es equivalente-expresión a split_view ( e, p ) para cualesquiera subexpresiones adecuadas e y p .

split_view modela los conceptos forward_range , y common_range cuando la view subyacente V modela los respectivos conceptos.

El rango interno ( ranges:: range_reference_t < split_view > ) es un ranges:: subrange < ranges:: iterator_t < V >> , que modela common_range , modela sized_range cuando ranges:: iterator_t < V > modela std:: sized_sentinel_for < ranges:: iterator_t < V >> , y modela contiguous_range , random_access_range , bidirectional_range , y forward_range cuando V modela los conceptos respectivos.

A diferencia de lazy_split_view , split_view mantiene la continuidad del subrango, haciéndolo adecuado para división de cadenas.

Contenidos

Miembros de datos

Miembro Descripción
V base_ (privado) la vista subyacente (adaptada) view
( objeto miembro solo para exposición* )
Pattern pattern_ (privado) el objeto patrón que se utiliza como delimitador para dividir la view subyacente
( objeto miembro solo para exposición* )
non-propagating-cache < ranges:: subrange
< ranges:: iterator_t < V >>>
cached_begin_ (privado)
un objeto que almacena en caché el resultado de la primera llamada a begin()
( objeto miembro solo para exposición* )

Funciones miembro

construye un 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)
busca la siguiente ocurrencia del patrón
( función miembro solo de exposición* )
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 miembro solo para exposición* )
el tipo de centinela
( clase miembro solo para exposición* )

Guías de deducción

Notas

Antes de P2210R2 , split_view utilizaba un mecanismo lazy para la división, y por lo tanto no podía mantener las propiedades bidireccionales, de acceso aleatorio o contiguas de la vista subyacente, ni hacer que el tipo de iterador del rango interno fuera igual al de la vista subyacente. En consecuencia, fue rediseñado por P2210R2 , y el mecanismo lazy se trasladó a lazy_split_view .

El delimitador pattern generalmente no debería ser un literal de cadena ordinario, ya que considerará el terminador nulo como parte necesaria del delimitador; por lo tanto, es recomendable usar un literal std::string_view en su lugar.

Ejemplo

#include <iomanip>
#include <iostream>
#include <ranges>
#include <string_view>
int main()
{
    using std::operator""sv;
    constexpr auto words{"Hello^_^C++^_^20^_^!"sv};
    constexpr auto delim{"^_^"sv};
    for (const auto word : std::views::split(words, delim))
        // con el constructor de rango de string_view de C++23:
        std::cout << std::quoted(std::string_view(word)) << ' ';
    std::cout << '\n';
}

Salida:

"Hello" "C++" "20" "!"

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 fue rediseñado

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)