std::ranges::subrange
De es.cppreference.net
| 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
|
(C++20)
|
obtiene un iterador o centinela de un
std::ranges::subrange
(plantilla de función) |
Tipos auxiliares
|
(C++20)
|
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
Ejecutar este código
#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
|
(C++20)
|
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
|