Namespaces
Variants

std::ranges::subrange

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rangos
 
 
Definido en el encabezado <ranges>
template<
    std::input_or_output_iterator I,
    std::sentinel_for<I> S = I,
    ranges::subrange_kind K = std::sized_sentinel_for<S, I> ?
                                  ranges::subrange_kind::sized :
                                  ranges::subrange_kind::unsized >
    requires (K == ranges::subrange_kind::sized || !std::sized_sentinel_for<S, I>)
class subrange
    : public ranges::view_interface<subrange<I, S, K>>
(1) (desde C++20)
Conceptos auxiliares
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
    /* see description */;
(2) (solo exposición*)
template<class From, class To>
concept /*convertible-to-non-slicing*/ = /* see description */;
(3) (solo exposición*)
1) La subrange plantilla de clase combina un iterador y un centinela en una única vista. Modela sized_range siempre que el parámetro de plantilla final sea subrange_kind​::​sized (lo que ocurre cuando se satisface std::sized_sentinel_for<S, I> o cuando se pasa size explícitamente como argumento del constructor).
2) Determina si From es convertible a To sin conversiones de cualificación. Equivalente a:
template<class From, class To>
concept /*uses-nonqualification-pointer-conversion*/ =
    std::is_pointer_v<From> && std::is_pointer_v<To> &&
        !std::convertible_to<std::remove_pointer_t<From>(*)[],
                             std::remove_pointer_t<To>(*)[]>;
3) Determina si From es convertible a To sin conversión de clase derivada a base:
template<class From, class To>
concept /*convertible-to-non-slicing*/ =
    std::convertible_to<From, To> &&
        !/*uses-nonqualification-pointer-conversion*/
            <std::decay_t<From>, std::decay_t<To>>;

Miembros de datos

Miembro Descripción
constexpr bool StoreSize [static] K == ranges::subrange_kind::sized &&
    !std::sized_sentinel_for<S, I>

(constante miembro estática solo para exposición*)
I begin_ un iterador al inicio del subrango
(objeto miembro solo para exposición*)
S end_ un centinela que denota el final del subrango
(objeto miembro solo para exposición*)
make-unsigned-like-t <std::iter_difference_t<I>> size_
(presente solo si StoreSize es true)
el tamaño del subrango
(objeto miembro solo para exposición*)

Funciones miembro

crea un nuevo subrange
(función miembro pública)
convierte el subrange a un tipo pair-like
(función miembro pública)
Observadores
obtiene el iterador
(función miembro pública)
obtiene el centinela
(función miembro pública)
verifica si el subrange está vacío
(función miembro pública)
obtiene el tamaño del subrange
(función miembro pública)
Operaciones de iterador
avanza el iterador una distancia dada
(función miembro pública)
obtiene una copia del subrange con su iterador decrementado una distancia dada
(función miembro pública)
obtiene una copia del subrange con su iterador avanzado una distancia dada
(función miembro pública)
Heredado de ranges::view_interface
(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, provisto solo si ranges::empty es aplicable a ella
(función miembro pública de std::ranges::view_interface<D>)
obtiene la dirección de los datos de la vista derivada, provisto solo si su tipo iterador satisface contiguous_iterator
(función miembro pública de std::ranges::view_interface<D>)
devuelve el primer elemento en la vista derivada, provisto si satisface forward_range
(función miembro pública de std::ranges::view_interface<D>)
devuelve el último elemento en la vista derivada, provisto solo si satisface bidirectional_range y common_range
(función miembro pública de std::ranges::view_interface<D>)
devuelve el nésimo elemento en la vista derivada, provisto solo si satisface random_access_range
(función miembro pública de std::ranges::view_interface<D>)

Guías de deducción

Funciones no miembro

obtiene un iterador o centinela de un std::ranges::subrange
(plantilla de función)

Tipos auxiliares

especifica si un std::ranges::subrange modela std::ranges::sized_range
(enumeración)
obtiene el tamaño de un std::ranges::subrange
(especialización de plantilla de clase)
obtiene el tipo del iterador o del centinela de un std::ranges::subrange
(especialización de plantilla de clase)

Plantillas auxiliares

template < class I, class S, ranges:: subrange_kind K >
constexpr bool ranges:: enable_borrowed_range < ranges :: subrange < I, S, K >> = true ;
(desde C++20)

Esta especialización de ranges:: enable_borrowed_range hace que subrange cumpla con borrowed_range .

Ejemplo

#include <map>
#include <print>
#include <ranges>
void make_uppercase(char& v)
{
    v += 'A' - 'a';
}
void uppercase_transform(std::multimap<int, char>& m, int k)
{
    auto [first, last] = m.equal_range(k);
    for (auto& [_, v] : std::ranges::subrange(first, last))
        make_uppercase(v);
}
int main()
{
    std::multimap<int, char> mm{{4, 'a'}, {3, '-'}, {4, 'b'}, {5, '-'}, {4, 'c'}};
    std::println("Before: {}", mm);
    uppercase_transform(mm, 4);
    std::println("After:  {}", mm);
}

Salida:

Before: {3: '-', 4: 'a', 4: 'b', 4: 'c', 5: '-'}
After:  {3: '-', 4: 'A', 4: 'B', 4: 'C', 5: '-'}

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
LWG 3470 C++20 convertible-to-non-slicing podría rechazar conversiones de calificación siempre las acepta

Véase también

clase de plantilla auxiliar para definir una view , utilizando el patrón de plantilla curioso y recurrente
(clase de plantilla)

Enlaces externos

Leer/escribir todos los valores de un std::multimap con una clave dada en C++20 — SO