Espacios de nombres
Variantes

std::ranges::views::common, std::ranges::common_view

De cppreference.com
 
 
Biblioteca de rangos
Adaptadores de rangos
 
 
<tbody> </tbody>
Definido en el archivo de encabezado <ranges>
template< ranges::view V > requires (!ranges::common_range<V> && std::copyable<ranges::iterator_t<V>>) class common_view : public ranges::view_interface<common_view<V>>
(1) (desde C++20)
namespace views { inline constexpr /*no especificado*/ common = /*no especificado*/; }
(2) (desde C++20)
Signatura de la llamada
template< ranges::viewable_range R > requires /* véase a continuación */ constexpr ranges::view auto common( R&& r );
(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 y decltype((e)) modela common_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

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]
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

Plantillas auxiliares

<tbody> </tbody>
template<class T> inline constexpr bool enable_borrowed_range<std::ranges::common_view<T>> = std::ranges::enable_borrowed_range<T>;
(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.

Véase también

Especifica que un rango tiene tipos iterador y centinela idénticos.
(concepto) [editar]
Adapta un tipo de iterador y su centinela a un tipo de iterador común.
(plantilla de clase) [editar]