Namespaces
Variants

std::ranges:: subrange

From cppreference.net
Ranges library
Range adaptors
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*/ =

/* ver descripción */ ;
(2) ( solo exposición* )
template < class From, class To >
concept /*convertible-to-non-slicing*/ = /* ver descripción */ ;
(3) ( solo exposición* )
1) La plantilla de clase subrange combina un iterador y un centinela en una única view . Modela sized_range siempre que el parámetro de plantilla final sea subrange_kind​ :: ​sized (lo cual ocurre cuando se satisface std:: sized_sentinel_for < S, I > o cuando el tamaño se pasa explícitamente como argumento del constructor).
2) Determina si From es convertible a To sin conversiones de calificació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 derivado-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>>;

Contenidos

Miembros de datos

Miembro Definició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 std::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, proporcionado 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, proporcionado solo si su tipo de iterador satisface contiguous_iterator
(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> )
devuelve el último elemento en la vista derivada, proporcionado solo si satisface bidirectional_range y common_range
(función miembro pública de std::ranges::view_interface<D> )
devuelve el elemento n ésimo en la vista derivada, proporcionado 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