Namespaces
Variants

std::ranges::views::take, std::ranges::take_view

De es.cppreference.net
 
 
Biblioteca de rangos
Adaptadores de rango
 
 
Definido en el encabezado <ranges>
template< ranges::view V >
class take_view
    : public ranges::view_interface<take_view<V>>
(1) (desde C++20)
namespace views {
    inline constexpr /* unspecified */ take = /* unspecified */;
}
(2) (desde C++20)
Firma de llamada
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto
    take( R&& r, ranges::range_difference_t<R> count );
(desde C++20)
template< class DifferenceType >
constexpr /* range adaptor closure */ take( DifferenceType&& count );
(desde C++20)
1) Un adaptador de rango que representa una vista de los elementos de una secuencia subyacente, comenzando desde el inicio y terminando en un límite dado.
2) views::take es un RangeAdaptorObject. La expresión views::take(e, f) produce una vista que representa los primeros f elementos de e. El resultado no es necesariamente un take_view.

views::take(e, f) es equivalente en expresión a (donde T es std::remove_cvref_t<decltype((e))> y D es ranges::range_difference_t<decltype((e))>):

  • ((void)f, decay-copy(e)), si T es un ranges::empty_view, excepto que las evaluaciones de e y f se secuencian de manera indeterminada;
  • U(ranges::begin(e), ranges::begin(e) + std::min<D>(ranges::distance(e), f)), si T es una especialización de std::span, std::basic_string_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, si T es una especialización de std::basic_string_view;
  • ranges::subrange<ranges::iterator_t<T>>, si T es una especialización de ranges::subrange;
  • ranges::iota_view(*ranges::begin(e),
    *(ranges::begin(e) + std::min<D>(ranges::distance(e), f)))
    , si T es una especialización de ranges::iota_view que modela tanto random_access_range como sized_range;
  • views::repeat(*e.value_, std::min<D>(ranges::distance(e), f)), si T modela sized_range; en tal caso e se evalúa solo una vez;
  • views::repeat(*e.value_, static_cast<D>(e)) de lo contrario;
(desde C++23)
  • de lo contrario, take_view(e, f).
En todos los casos, decltype((f)) debe modelar std::convertible_to<D>.

take_view modela los conceptos contiguous_range, random_access_range, bidirectional_range, forward_range, input_range y sized_range cuando la vista subyacente V modela los conceptos respectivos. Modela common_range cuando la vista subyacente V modela tanto random_access_range como sized_range.

Miembros de datos

Miembro Descripción
V base_ la vista subyacente
( objeto miembro solo para exposición* )
ranges:: range_difference_t < V > count_ el número de elementos a tomar
( objeto miembro solo para exposición* )

Funciones miembro

construye un take_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

Clases anidadas

(C++20)
el tipo centinela
( clase plantilla miembro solo para exposición* )

Plantillas auxiliares

template < class T >

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

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

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

Ejemplo

#include <algorithm>
#include <iostream>
#include <ranges>
int main()
{
    namespace views = std::views;
    auto print = [](char x){ std::cout << x; };
    for (const char nums[]{'1', '2', '3'};
         int n : views::iota(0, 5))
    {
        std::cout << "take(" << n << "): ";
        // safely takes only upto min(n, nums.size()) elements:
        std::ranges::for_each(nums | views::take(n), print);
        std::cout << '\n';
    }
}

Salida:

take(0): 
take(1): 1
take(2): 12
take(3): 123
take(4): 123

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::take ocasionalmente fallaba al
construir un rango de acceso aleatorio dimensionado
el tipo de resultado se ajusta para que
la construcción sea siempre válida
LWG 3494 C++20 take_view nunca era un borrowed_range es un borrowed_range si su vista subyacente lo es

Véase también

crea un subrango a partir de un iterador y un conteo
(objeto de punto de personalización)
una view que consiste en los elementos iniciales de otra view , hasta el primer elemento en el cual un predicado devuelve false
(plantilla de clase) (objeto adaptador de rango)
copia un número de elementos a una nueva ubicación
(objeto función algoritmo)