std::ranges::views::iota, std::ranges::iota_view
| Definido en el archivo de encabezado <ranges>
|
||
template< std::weakly_incrementable W, std::semiregular Bound = std::unreachable_sentinel_t > requires __WeaklyEqualityComparableWith<W, Bound> && std::copyable<W> class iota_view : public ranges::view_interface<iota_view<W, Bound>> |
(1) | (desde C++20) |
namespace views { inline constexpr /*no especificado*/ iota = /*no especificado*/; } |
(2) | (desde C++20) |
| Signatura de la llamada |
||
template< class W > requires /* véase a continuación */ constexpr /* véase a continuación */ iota( W&& value ); |
(desde C++20) | |
template< class W, class Bound > requires /* véase a continuación */ constexpr /* véase a continuación */ iota( W&& value, Bound&& bound ); |
(desde C++20) | |
views::iota(e) y views::iota(e, f) son equivalentes-en-expresión a (tienen el mismo efecto que) iota_view(e) y iota_view(e, f) respectivamente para cualquier subexpresión e y f adecuadas.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.
Objetos de punto de personalización
El nombre views::iota_view denota un objeto de punto de personalización, que es un objeto función const de un tipo clase literal semiregular (denotado, a efectos de exposición, como iota_view_ftor). Todos los ejemplares de iota_view_ftor son iguales. Por lo tanto, views::iota_view puede copiarse libremente y sus copias pueden usarse indistintamente.
Dado un conjunto de tipos Args..., si std::declval<Args>()... cumple con los requerimientos para los argumentos de views::iota_view mencionado anteriormente, iota_view_ftor satisfará a std::invocable<const iota_view_ftor&, Args...>. De lo contrario, ningún operador de llamada a función de iota_view_ftor participa en la resolución de sobrecarga.
Datos miembro
La implementación típica de iota_view contiene dos datos miembros de datos no estáticos: el valor inicial value_ de tipo W y el valor centinela bound_ de tipo Bound. Los nombres que se muestran aquí son solo de exposición.
Funciones miembro
(constructor) (C++20) |
Construye un objeto iota_view. (función miembro pública) |
begin (C++20) |
Obtiene el iterador al comienzo de una iota_view. (función miembro pública) |
end (C++20) |
Obtiene el centinela que denota el find de una iota_view. (función miembro pública) |
size (C++20) |
Obtiene el tamaño de una iota_view si tiene tamaño. (función miembro pública) |
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>)
|
(C++20) |
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>)
|
(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>)
|
(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>)
|
(C++20) |
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>)
|
std::ranges::iota_view::iota_view
<tbody> </tbody> iota_view() requires std::default_initializable<W> = default; |
(1) | (desde C++20) |
constexpr explicit iota_view( W value ); |
(2) | (desde C++20) |
constexpr iota_view( std::type_identity_t<W> value, std::type_identity_t<Bound> bound ); |
(3) | (desde C++20) |
constexpr iota_view( /*iterador*/ first, /* véase a continuación */ last ); |
(4) | (desde C++20) |
value_ y bound_ por valor mediante sus inicializadores de miembro por defecto (= W() y = Bound()).value_ con value e inicializa bound_ por valor. Este constructor se usa para crear iota_views sin límites, p. ej., iota(0) produce los números numbers 0,1,2..., infinitamente.value_ con value y bound_ con bound. El comportamiento no está definido si se modela std::totally_ordered_with<W, Bound> y bool(value <= bound) es false. Este constructor se usa para crear iota_views con límites, p. ej., iota(10, 20) produce números del 10 al 19.value_ se inicializa con el valor W almacenado en first, y
- si
WyBoundson del mismo tipo, entonces el tipo delastes/*iterador*/ybound_se inicializa con el valorWalmacenado enlast, - de lo contrario, si la vista
iota_viewno tiene límites (es decir,Boundes std::unreachable_sentinel_t), entonces el tipo delastes std::unreachable_sentinel_t ybound_se inicializa con el valor std::unreachable_sentinel. - de lo contrario, el tipo de
lastes/*centinela*/ybound_se inicializa con el valorBoundalmacenado enlast.
last es el mismo que decltype(end()).Para (2), (3), y (4), el comportamiento no está definido si la iota_view tiene límites (es decir, Bound no es std::unreachable_sentinel_t) y bound_ se inicializa a un valor inalcanzable desde value_.
Parámetros
| value | - | El valor inicial. |
| bound | - | El límite. |
| first | - | El iterador que denota el valor inicial. |
| last | - | El iterador que denota o centinela que denota el límite. |
std::ranges::iota_view::begin
<tbody> </tbody> constexpr /*iterador*/ begin() const; |
(desde C++20) | |
Devuelve un iterador inicializado con value_.
std::ranges::iota_view::end
<tbody> </tbody> constexpr auto end() const; |
(1) | (desde C++20) |
constexpr /*iterador*/ end() const requires std::same_as<W, Bound>; |
(2) | (desde C++20) |
/*centinela*/) inicializado con bound_ si está vista tiene límites, o std::unreachable_sentinel si esta vista no tiene límites.std::ranges::iota_view::size
<tbody> </tbody> constexpr auto size() const requires (std::same_as<W, Bound> && /*avanzable*/<W>) || (/*es-similar-a-un-entero*/<W> && /*es-similar-a-un-entero*<Bound>) || std::sized_sentinel_for<Bound, W> { if constexpr (/*es-similar-a-un-entero*/<W> && /*es-similar-a-un-entero*/<Bound>) return (value_ < 0) ? ((bound_ < 0) ? /*a-similar-a-unsigned*/(-value_) - /*a-similar-a-unsigned*/(-bound_) : /*a-similar-a-unsigned*/(bound_) + /*a-similar-a-unsigned*/(-value_)) : /*a-similar-a-unsigned*/(bound_) - /*a-similar-a-unsigned*/(value_); else return /*a-similar-a-unsigned*/(bound_ - value_); } |
(desde C++20) | |
Devuelve el tamaño de la vista si la vista tiene límites.
El concepto de solo exposición avanzable se describe en esta página.
La función de plantilla de solo exposición a-similar-a-unsigned convierte su argumento (que debe ser similar a un entero) a la versión correspondiente sin signo del tipo del argumento.
Guías de deducción
<tbody> </tbody> template<class W, class Bound> requires (!/*es-similar-a-un-entero*/<W> || !/*es-similar-a-un-entero*/<Bound> || /*es-similar-a-un-entero-con-signo*/<W> == /*es-similar-a-un-entero-con-signo*/<Bound>) iota_view(W, Bound) -> iota_view<W, Bound>; |
(desde C++20) | |
Para cualquier tipo T, /*es-similar-a-un-entero*/<T> es true si y solo si T es similar a un entero, y /*es-similar-a-un-entero-con-signo*/<T> es true si y solo si T es similar a un entero y capaz de representar valores negativos.
Ten en cuenta que la guía se protege contra errores de discrepancia con signo/sin signo, como views::iota(0, v.size()), donde 0 es un int con signo y v.size() es std::size_t (sin signo).
Clases anidadas
(C++20) |
El tipo iterador. (clase miembro de solo exposición) |
(C++20) |
El tipo centinela usado cuando la iota_view tiene límites, y Bound y W no son del mismo tipo.(clase miembro de solo exposición) |
Plantillas auxiliares
<tbody> </tbody> template<std::weakly_incrementable W, std::semiregular Bound> inline constexpr bool enable_borrowed_range<ranges::iota_view<W, Bound>> = true; |
(desde C++20) | |
Esta especialización de std::ranges::enable_borrowed_range hace que iota_view satisfaga borrowed_range.
Ejemplo
#include <ranges>
#include <iostream>
#include <algorithm>
int main()
{
for (int i : std::ranges::iota_view{1, 10})
std::cout << i << ' ';
std::cout << '\n';
for (int i : std::views::iota(1, 10))
std::cout << i << ' ';
std::cout << '\n';
for (int i : std::views::iota(1) | std::views::take(9))
std::cout << i << ' ';
std::cout << '\n';
std::ranges::for_each(std::views::iota(1, 10), [](int i) {
std::cout << i << ' ';
});
std::cout << '\n';
}
Salida:
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
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 3523 | C++20 | El par iterador-centinela podría usar el tipo centinela equivocado. | Se corrigió. |
| P2325R3 | C++20 | iota_view requería que W fuera semiregularya que view requería default_initializable
|
Solo requiere que W sea copyable.
|
| LWG 3610 | C++20 | size podría rechazar tipos de clase enteros.
|
Se hizo que se aceptara si es posible. |
Véase también
(C++11) |
Llena un rango con incrementos sucesivos del mismo valor de partida (plantilla de función) |