std::ranges::views::common, std::ranges::common_view - cppreference.com
De cppreference.com
| Definido en el archivo de encabezado |
||
|
|
(1) | (desde C++20) |
|
|
(2) | (desde C++20) |
| Signatura de la llamada |
||
|
|
(desde C++20) | |
1) Adapta una vista (view) dada con distintos tipos para el par iterador/centinela a una vista que también es un rango comúm (common_range). Una vista common_view siempre tiene el mismo tipo iterador/centinela.
2) Objeto adaptador de rango. Sea e una subexpresión. Entonces la expresión views::common(e) es equivalente en expresión a:
views::all(e), si es una expresión bien formada ydecltype((e))modelacommon_range;common_view{e}de lo contrario.
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.
Datos miembro
Las implementaciones típicas de common_view solo albergan un dato miembro no estático: la vista subyacente de tipo V.
Funciones miembro
(C++20) |
Construye un objeto common_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 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]
|
(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>) [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]
|
(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>) [editar]
|
Guías de deducción
Plantillas auxiliares
|
|
(desde C++20) | |
Esta especialización de std::ranges::enable_borrowed_range hace que common_view satisfaga borrowed_range cuando la vista subyacente lo satisface.
Notas
common_view puede ser útil para trabajar con algoritmos heredados que esperan que el iterador y el centinela sean del mismo tipo.
Ejemplo
#include <iostream> #include <iterator> #include <numeric> #include <ranges> #include <list> int main() { auto v1 = { 1, 2, 3, 4, 5 }; auto i1 = std::counted_iterator{v1.begin(), std::ssize(v1)}; auto r1 = std::ranges::subrange{i1, std::default_sentinel}; // auto e1 = std::accumulate(r1.begin(), r1.end(), 0); // ERROR: se requiere "rango común" auto c1 = std::ranges::common_view{r1}; std::cout << "accumulate: " << std::accumulate(c1.begin(), c1.end(), 0) << '\n'; // heredadas de ranges::view_interface: std::cout << "c1.front(): " << c1.front() << '\n'; std::cout << "c1.back(): " << c1.back() << '\n'; std::cout << "c1.data(): " << c1.data() << '\n'; std::cout << "c1[0]: " << c1[0] << '\n'; auto v2 = std::list{ 1, 2, 3, 4, 5 }; auto i2 = std::counted_iterator{v2.begin(), std::ssize(v2)}; auto r2 = std::ranges::subrange{i2, std::default_sentinel}; // auto e2 = std::accumulate(r2.begin(), r2.end(), 0); // ERROR: se requiere "rango común" auto c2 = std::ranges::common_view{r2}; std::cout << "accumulate: " << std::accumulate(c2.begin(), c2.end(), 0) << '\n'; // heredadas de ranges::view_interface: std::cout << "c2.front(): " << c2.front() << '\n'; // auto e3 = c2.back(); // ERROR: se requiere "rango contiguo" // auto e4 = c2.data(); // ERROR: se requiere "rango contiguo" // auto e5 = c2[0]; // ERROR: se requiere "rango contiguo" }
Posible salida:
accumulate: 15 c1.front(): 1 c1.back(): 5 c1.data(): 0x400ec0 c1[0]: 1 accumulate: 15 c2.front(): 1
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 | common_view nunca fue un borrowed_range.
|
Es un borrowed_range si su vista subyacente lo es.
|