Namespaces
Variants

std::ranges::views::drop, std::ranges::drop_view

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rango
 
 
Definida en el encabezado <ranges>
template< ranges::view V >
class drop_view
    : public ranges::view_interface<drop_view<V>>
(1) (desde C++20)
namespace views {
    inline constexpr /* unspecified */ drop = /* unspecified */;
}
(2) (desde C++20)
Firma de llamada
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto
    drop( R&& r, ranges::range_difference_t<R> count );
(desde C++20)
template< class DifferenceType >
constexpr /* range adaptor closure */ drop( DifferenceType&& count );
(desde C++20)
1) Un adaptador de rango que consiste en elementos de la secuencia subyacente, saltándose los primeros N elementos.
2) RangeAdaptorObject. Dado T es std::remove_cvref_t<decltype((e))> y D es ranges::range_difference_t<decltype((e))>), la expresión views::drop(e, f) es equivalente a expresión a:
  • ((void)f, decay-copy(e)), si T es un ranges::empty_view, excepto que las evaluaciones de e y f están secuenciadas indeterminadamente;
  • de lo contrario, T(ranges::begin(e) + inc, ranges::end(e),
    /*to-unsigned-like*/(ranges::distance(e) - inc))
    , si T es una especialización de ranges::subrange que modela tanto random_access_range como sized_range, y T necesita almacenar el tamaño (consulte ranges::subrange::subrange() para más detalles), donde inc es std::min<D>(ranges::distance(e), f);
  • de lo contrario, U(ranges::begin(e) + inc, ranges::end(e)), si T es una especialización de std::span, std::basic_string_view, ranges::iota_view, o ranges::subrange que modela tanto random_access_range como sized_range, donde U es
  • std::span<typename T::element_type>, si T es una especialización de std::span;
  • T de lo contrario;
  • views::repeat(*e.value_, ranges::distance(e) - inc), si T modela sized_range; en tal caso e se evalúa solo una vez;
  • ((void)e, auto(f)) de lo contrario, excepto que las evaluaciones de e y f están secuenciadas indeterminadamente;
(desde C++23)
  • de lo contrario, drop_view(e, f).
En todos los casos, decltype((f)) debe modelar std::convertible_to<D>.

drop_view modela los conceptos contiguous_range, random_access_range, bidirectional_range, forward_range, input_range, common_range, y sized_range cuando la vista subyacente V modela los conceptos respectivos.

Miembros de datos

Miembro Descripción
V base_ (privado) la vista subyacente
(objeto miembro de solo exposición*)
ranges::range_difference_t<V> count_ (privado) el número de elementos a saltar
(objeto miembro de solo exposición*)
caché no propagante<ranges::iterator_t<V>> cache_ (privado)
(presente solo si V satisface forward_range
pero no random_access_range y sized_range)
un objeto que almacena en caché el resultado de las llamadas a begin()
(objeto miembro de solo exposición*)

Funciones miembro

construye un drop_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)
devuelve el número de elementos, proporcionado solo si el rango subyacente (adaptado) satisface sized_range
(función miembro pública)
devuelve el tamaño aproximado del approximately_sized_range resultante
(función miembro pública)
Heredado de 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>)
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 nésimo elemento 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

Plantillas auxiliares

template < class T >

constexpr bool enable_borrowed_range < std :: ranges :: drop_view < T >> =

ranges:: enable_borrowed_range < T > ;
(desde C++20)

Esta especialización de ranges::enable_borrowed_range hace que drop_view satisfaga borrowed_range cuando la vista subyacente la satisface.

Ejemplo

#include <initializer_list>
#include <iostream>
#include <ranges>
int main()
{
    const auto nums = {1, 2, 3, 4, 5, 6, 7};
    std::cout << "drop " << 2 << ": ";
    for (int i : std::ranges::drop_view{nums, 2})
        std::cout << i << ' ';
    std::cout << '\n';
    std::cout << "drop " << 3 << ": ";
    for (int i : nums | std::views::drop(3))
        std::cout << i << ' ';
    std::cout << '\n';
    std::cout << "drop " << 4 << ": ";
    for (int i : std::views::iota(1, 8) | std::views::drop(4))
        std::cout << i << ' ';
    std::cout << '\n';
    // Nota: eliminar más elementos de los disponibles es válido:
    for (int dp : {5, 6, 7, 890, 100500})
    {
        std::cout << "drop " << dp << ": ";
        for (int i : std::views::iota(1, 8) | std::views::drop(dp))
            std::cout << i << ' ';
        std::cout << '\n';
    }
}

Salida:

drop 2: 3 4 5 6 7
drop 3: 4 5 6 7
drop 4: 5 6 7
drop 5: 6 7
drop 6: 7
drop 7:
drop 890: 
drop 100500:

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 3407 C++20 views::drop a veces falla al
construir un rango de acceso aleatorio con tamaño
la construcción se ajusta
para que siempre sea válida
LWG 3494 C++20 drop_view nunca fue un borrowed_range es un borrowed_range si su vista subyacente lo es

Véase también

una view que consiste en los elementos de otra view , omitiendo la subsecuencia inicial de elementos hasta el primer elemento donde el predicado devuelve false
(plantilla de clase) (objeto adaptador de rango)