Espacios de nombres
Variantes

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

De cppreference.com
 
 
Biblioteca de rangos
Adaptadores de rangos
 
 
<tbody> </tbody>
Definido en el archivo de encabezado <ranges>
template< ranges::view V > class take_view : public ranges::view_interface<take_view<V>>
(1) (desde C++20)
namespace views { inline constexpr /*no especificado*/ take = /*no especificado*/; }
(2) (desde C++20)
Signatura de la llamada
template< ranges::viewable_range R, class DifferenceType > requires /* véase a continuación */ constexpr ranges::view auto take( R&& r, DifferenceType&& count );
(desde C++20)
template< class DifferenceType > constexpr /*cierre de adaptador de rango*/ take( DifferenceType&& count );
(desde C++20)
1) Un adaptador de rango que representa una vista (view) de los elementos de una secuencia subyacente, iniciando en el comienzo y terminando en un límite dado.
2) views::take es un objeto adaptador de rango. La expresión views::take(e, f) resulta en una vista que representa los primeros f elementos de e. El resultado no es necesariamente un objeto take_view.

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, static_cast<T>(e)), si T es una vista ranges::empty_view, excepto que las evaluaciones de e y f están secuenciadas 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;
  • 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.

Equivalente en expresión

La expresión e es equivalente-en-expresión a la expresión f, si e y f tienen los mismos efectos, ambas potencialmente lanzan o ambas potencialmente no lanzan (es decir, noexcept (e) == noexcept(f)), y ambas son subexpresiones constantes o ambas no son subexpresiones constantes.

Funciones miembro

Construye un objeto take_view
(función miembro pública) [editar]
(C++20)
Devuelve una copia de la vista (adaptada) subyacente.
(función miembro pública) [editar]
(C++20)
Devuelve un iterador al comienzo.
(función miembro pública) [editar]
(C++20)
Devuelve un iterador o un centinela al final.
(función miembro pública) [editar]
(C++20)
Devuelve el número de elementos. Se proporciona solo si el rango (adaptado) subyacente satisface sized_range .
(función miembro pública) [editar]
Heredadas de ranges::view_interface
(C++20)
Devuelve si la vista derivada está vacía o no. Se proporciona si la vista derivada satisface forward_range.
(función miembro pública de std::ranges::view_interface<D>) [editar]
Devuelve si la vista derivada está vacía o no. Se proporciona si ranges::empty le es aplicable.
(función miembro pública de std::ranges::view_interface<D>) [editar]
(C++20)
Obtiene la dirección de los datos de una vista derivada. Se proporciona si su tipo iterador satisface contiguous_iterator.
(función miembro pública de std::ranges::view_interface<D>) [editar]
(C++20)
Devuelve el primer elemento en la vista derivada. Se proporciona si la vista derivada satisface forward_range.
(función miembro pública de std::ranges::view_interface<D>) [editar]
(C++20)
Devuelve el último elemento en una vista derivada. Se proporciona si la vista derivada satisface bidirectional_range y common_range.
(función miembro pública de std::ranges::view_interface<D>) [editar]
Devuelve el enésimo elemento en la vista derivada. Se proporciona si la vista derivada satisface random_access_range.
(función miembro pública de std::ranges::view_interface<D>) [editar]

Guías de deducción

Clases anidadas

(C++20)
El tipo centinela.
(plantilla de clase miembro de solo exposición)

Plantillas auxiliares

<tbody> </tbody>
template<class T> inline constexpr bool enable_borrowed_range<std::ranges::take_view<T>> = std::ranges::enable_borrowed_range<T>;
(desde C++20)

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

Ejemplo

#include <algorithm>
#include <iostream>
#include <ranges>

auto imprimir = [](char x) { std::cout << x; };

int main()
{
    constexpr char pi[] { '3', '.', '1', '4', '1', '5', '9', '2' };

    std::ranges::for_each(pi | std::ranges::views::take(6), imprimir);
    std::cout << '\n';

    std::ranges::for_each(std::ranges::take_view{pi, 42}, imprimir); // toma solo 8 chars
    std::cout << '\n';                                               // de manera segura
}

Salida:

3.1415
3.141592

Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 3494 C++20 take_view nunca era un borrowed_range Es un borrowed_range si su vista subyacente lo es.
LWG 3407 C++20 views::take a veces fracasaba al construir
un rango de acceso aleatorio con tamaño.
Se ajustó el tipo resultado para que la construcción siempre sea válida.

Véase también

Crea un subrango a partir de un iterador y una cuenta.
(objeto punto de personalización) [editar]
Una vista (view) que consiste en los elementos iniciales de otra vista, hasta el primer elemento sobre el que un predicado devuelva falso.
(plantilla de clase) (objeto adaptador de rango) [editar]
Copia un número de elementos a una nueva ubicación.
(niebloid) [editar]