std::ranges::views::take, std::ranges::take_view
| 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) | |
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)), siTes unranges::empty_view, excepto que las evaluaciones deeyfse secuencian de manera indeterminada;U(ranges::begin(e), ranges::begin(e) + std::min<D>(ranges::distance(e), f)), siTes una especialización de std::span, std::basic_string_view, o ranges::subrange que modela tanto random_access_range como sized_range, dondeUes
std::span<typename T::element_type>, siTes una especialización de std::span;T, siTes una especialización de std::basic_string_view;ranges::subrange<ranges::iterator_t<T>>, siTes una especialización de ranges::subrange;
ranges::iota_view(*ranges::begin(e),*(ranges::begin(e) + std::min<D>(ranges::distance(e), f))), siTes una especialización de ranges::iota_view que modela tanto random_access_range como sized_range;
|
(desde C++23) |
- de lo contrario,
take_view(e, f).
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) |
|
|
(C++26)
|
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
>>
=
|
(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
|
(C++20)
|
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) |
|
|
(C++20)
|
copia un número de elementos a una nueva ubicación
(objeto función algoritmo) |