◐ Shell
clean mode source ↗

std::ranges::owning_view - cppreference.com

De cppreference.com

Definido en el archivo de encabezado <ranges>

template<ranges::range R> requires std::movable<R> && (!/*es-lista-de-inicializadores*/<R>) class owning_view : public ranges::view_interface<owning_view<R>>

(desde C++20)

owning_view es una vista (view) que tiene propiedad única de un rango (range). Es de solo movimiento y almacena ese rango (range) dentro de ella..

La constante /*es-lista-de-inicializadores*/<R> en la clúsula requires es true si y solo si std::remove_cvref_t<R> es una especialización de std::initializer_list.

Datos miembro

Las implementaciones típicas de owning_view solo tienen un dato miembro no estático: el rango subyacente de tipo R. El miembro aquí se muestra como r_ (el nombre es solo de exposición).

Funciones miembro

(constructor)

(C++20)

Construye un objeto owning_view inicializando por valor o por movimiento el rango almacenado.
(función miembro pública)

operator=

(C++20)

Asigna por movimiento el rango almacenado.
(función miembro pública)

base

(C++20)

Devuelve una referencia al rango almacenado.
(función miembro pública)

begin

(C++20)

Devuelve el iterador al comienzo del rango almacenado.
(función miembro pública)

end

(C++20)

Devuelve el centinela del rango almacenado.
(función miembro pública)

empty

(C++20)

Verifica si el rango almacenado está vacío.
(función miembro pública)

size

(C++20)

Devuelve el tamaño del sized_range almacenado.
(función miembro pública)

data

(C++20)

Devuelve el puntero al comienzo del contiguous_range almacenado.
(función miembro pública)
Heredadas de ranges::view_interface
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)

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]

std::ranges::owning_view::owning_view

owning_view() requires std::default_initializable<R> = default;

(1) (desde C++20)

owning_view( owning_view&& other ) = default;

(2) (desde C++20)

constexpr owning_view( R&& t );

(3) (desde C++20)

owning_view( const owning_view& ) = delete;

(4) (desde C++20)

1) Constructor por defecto. Inicializa por valor el rango almacenado mediante su inicializador de miembro por defecto (= R()).

2) Constructor de movimiento. Construye por movimiento el rango almacenado a partir de other.

3) Construye por movimiento el rango almacenado a partir de t.

4) El constructor de copia está eliminado. owning_view es de solo movimiento.

Parámetros

other - La otra vista owning_view de la que mover.
t - El rango del que mover.

std::ranges::owning_view::operator=

owning_view& operator=( owning_view&& other ) = default;

(1) (desde C++20)

owning_view& operator=( const owning_view& ) = delete;

(2) (desde C++20)

1) Operador de asignación de movimiento. Asigna por movimiento el rango almacenado a partir de other.

2) El operador de asignación de copia está eliminado. owning_view es de solo movimiento.

Parámetros

other - La otra vista owning_view de la que mover.

Valor de retorno

*this.

std::ranges::owning_view::base

constexpr R& base() & noexcept;

(1) (desde C++20)

constexpr const R& base() const & noexcept;

(2) (desde C++20)

constexpr R&& base() && noexcept;

(3) (desde C++20)

constexpr const R&& base() const && noexcept;

(4) (desde C++20)

Devuelve una referencia al rango almacenado, manteniendo la categoría de valor y la calificación const.

1-2) Equivalente a return r_;.

3-4) Equivalente a return std::move(r_);.

std::ranges::owning_view::begin

constexpr ranges::iterator_t<R> begin();

(1) (desde C++20)

constexpr auto begin() const requires ranges::range<const R>;

(2) (desde C++20)

Equivalente a return ranges::begin(r_);.

std::ranges::owning_view::end

constexpr ranges::sentinel_t<R> end();

(1) (desde C++20)

constexpr auto end() const requires ranges::range<const R>;

(2) (desde C++20)

Equivalente a return ranges::end(r_);.

std::ranges::owning_view::empty

constexpr bool empty() requires requires { ranges::empty(r_); };

(1) (desde C++20)

constexpr bool empty() const requires requires { ranges::empty(r_); };

(2) (desde C++20)

Equivalente a return ranges::empty(r_);.

std::ranges::owning_view::size

constexpr auto size() requires ranges::sized_range<R>;

(1) (desde C++20)

constexpr auto size() const requires ranges::sized_range<const R>;

(2) (desde C++20)

Equivalente a return ranges::size(r_);.

std::ranges::owning_view::data

constexpr auto data() requires ranges::contiguous_range<R>;

(1) (desde C++20)

constexpr auto data() const requires ranges::contiguous_range<const R>;

(2) (desde C++20)

Equivalente a return ranges::data(r_);.

Plantillas auxiliares

template<class T> inline constexpr bool enable_borrowed_range<std::ranges::owning_view<T>> = std::ranges::enable_borrowed_range<T>;

(desde C++20)

Esta especialización de std::ranges::enable_borrowed_range hace que owning_view satisfaga borrowed_range cuando el rango subyacente lo satisface.

Ejemplo

#include <ranges>
#include <string>
#include <cassert>
#include <iostream>

int main()
{
    using namespace std::literals;
    std::ranges::owning_view ov{ "cosmos"s }; // el tipo deducido de R es std::string;
                                              // `ov` es el único dueño de esta cadena
    std::cout
        << std::boolalpha
        << "llamada a empty()   : " << ov.empty() << '\n'
        << "llamada a size()    : " << ov.size() << '\n'
        << "llamada a front()   : " << ov.front() << '\n' // lo mismo que *(ov.begin())
        << "llamada a back()    : " << ov.back() << '\n'  // igual a *(ov.end()-1)
        << "llamada a data()    : " << ov.data() << '\n'
        << "llamada a base()    : " << ov.base().size() << '\n' // ~> ov.size()
        << "sizeof(ov)          : " << sizeof(ov) << '\n' // típicamente igual a sizeof(R)
        << "for basado en rango : \"";

    for (const char c: ov)
        std::cout << c;
    std::cout << "\"\n";

    std::ranges::owning_view<std::string> ov2;
    assert(ov2.empty());
//  ov2 = ov; // ERROR: el operador de asignacón de copia está eliminado
    ov2 = std::move(ov); // de acuerdo
    assert(ov.empty());
    assert(ov2.size() == 6);
}

Posible salida:

llamada a empty()   : false
llamada a size()    : 6
llamada a front()   : c
llamada a back()    : s
llamada a data()    : cosmos
llamada a base()    : 6
sizeof(ov)          : 32
for basado en rango : "cosmos"

Véase también