Namensräume
Varianten
Aktionen

std::ranges::owning_view

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <ranges>
template< ranges::range R >

    erfordert std::movable<R> && (!/*is-initializer-list*/<R>)
class owning_view

    : public ranges::view_interface<owning_view<R>>
(seit C++20)

owning_view ist eine view, die das alleinige Eigentum an einem range besitzt. Sie ist nur verschiebbar und speichert diesen range darin.

Der konstante Ausdruck /*is-initializer-list*/<R> in der Er-Klausel ist true genau dann, wenn std::remove_cvref_t<R> eine Spezialisierung von std::initializer_list ist.

Inhalt

[edit] Datenelemente

Member-Name Definition
r_ (private) Der zugrundeliegende Range vom Typ R.
((exposition-only member object*)

[edit] Memberfunktionen

konstruiert eine owning_view durch Wertinitialisierung oder Verschiebekonstruktion des gespeicherten Ranges
(öffentliche Memberfunktion)
verschiebt den gespeicherten Range
(öffentliche Memberfunktion)
gibt eine Referenz auf den gespeicherten Range zurück
(öffentliche Memberfunktion)
gibt den Anfangs-Iterator des gespeicherten Ranges zurück
(öffentliche Memberfunktion)
gibt das Sentinel des gespeicherten Ranges zurück
(öffentliche Memberfunktion)
prüft, ob der gespeicherte Range leer ist
(öffentliche Memberfunktion)
gibt die Größe des gespeicherten sized_range zurück
(öffentliche Memberfunktion)
gibt den Zeiger auf den Anfang des gespeicherten contiguous_range zurück
(öffentliche Memberfunktion)
Geerbt von std::ranges::view_interface
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur, wenn ranges::empty darauf anwendbar ist
(public member function of std::ranges::view_interface<D>) [edit]
gibt das erste Element in der abgeleiteten View zurück, bereitgestellt, wenn sie forward_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]
gibt das letzte Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie bidirectional_range und common_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]
gibt das n-te Element in der abgeleiteten View zurück, nur bereitgestellt, wenn sie random_access_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]

std::ranges::owning_view::owning_view

owning_view() erfordert std::default_initializable<R> = default;
(1) (seit C++20)
owning_view( owning_view&& other ) = default;
(2) (seit C++20)
constexpr owning_view( R&& t );
(3) (seit C++20)
owning_view( const owning_view& ) = delete;
(4) (seit C++20)
1) Standardkonstruktor. Initialisiert den gespeicherten Range per Wert durch seine Standardmember-Initialisierung (= R()).
2) Verschiebekonstruktor. Erstellt den gespeicherten Range durch Verschieben aus dem von other.
3) Erstellt den gespeicherten Range durch Verschieben aus t.
4) Kopierkonstruktor ist gelöscht. owning_view ist nur verschiebbar.

Parameter

Sonstiges - eine weitere owning_view zum Verschieben aus
t - Range zum Verschieben aus

std::ranges::owning_view::operator=

owning_view& operator=( owning_view&& other ) = default;
(1) (seit C++20)
owning_view& operator=( const owning_view& ) = delete;
(2) (seit C++20)
1) Zuweisungsoperator für das Verschieben. Verschiebt den gespeicherten Range aus dem von other.
2) Zuweisungsoperator für das Kopieren ist gelöscht. owning_view ist nur verschiebbar.

Parameter

Sonstiges - eine weitere owning_view zum Verschieben aus

Rückgabewert

*this

std::ranges::owning_view::base

constexpr R& base() & noexcept;
(1) (seit C++20)
constexpr const R& base() const & noexcept;
(2) (seit C++20)
constexpr R&& base() && noexcept;
(3) (seit C++20)
constexpr const R&& base() const && noexcept;
(4) (seit C++20)

Gibt eine Referenz auf den gespeicherten Range zurück, wobei die Wertkategorie und die const-Qualifikation beibehalten werden.

1,2) Entspricht return r_;.
3,4) Entspricht return std::move(r_);.

std::ranges::owning_view::begin

constexpr ranges::iterator_t<R> begin();
(1) (seit C++20)
constexpr auto begin() const requires ranges::range<const R>;
(2) (seit C++20)

Entspricht return ranges::begin(r_);.

std::ranges::owning_view::end

constexpr ranges::sentinel_t<R> end();
(1) (seit C++20)
constexpr auto end() const requires ranges::range<const R>;
(2) (seit C++20)

Entspricht return ranges::end(r_);.

std::ranges::owning_view::empty

constexpr bool empty() requires requires { ranges::empty(r_); };
(1) (seit C++20)
constexpr bool empty() const requires requires { ranges::empty(r_); };
(2) (seit C++20)

Entspricht return ranges::empty(r_);.

std::ranges::owning_view::size

constexpr auto size() requires ranges::sized_range<R>;
(1) (seit C++20)
constexpr auto size() const requires ranges::sized_range<const R>;
(2) (seit C++20)

Entspricht return ranges::size(r_);.

std::ranges::owning_view::data

constexpr auto data() requires ranges::contiguous_range<R>;
(1) (seit C++20)
constexpr auto data() const requires ranges::contiguous_range<const R>;
(2) (seit C++20)

Entspricht return ranges::data(r_);.

[edit] Hilfsschablonen

template< class T >

constexpr bool enable_borrowed_range<std::ranges::owning_view<T>> =

    ranges::enable_borrowed_range<T>;
(seit C++20)

Diese Spezialisierung von ranges::enable_borrowed_range lässt owning_view borrowed_range erfüllen, wenn der zugrundeliegende Range dies tut.

[edit] Beispiel

#include <cassert>
#include <iostream>
#include <ranges>
#include <string>
 
int main()
{
    using namespace std::literals;
    std::ranges::owning_view ov{"cosmos"s}; // the deduced type of R is std::string;
                                            // `ov` is the only owner of this string
    assert(
        ov.empty() == false &&
        ov.size() == 6 &&
        ov.size() == ov.base().size() &&
        ov.front() == 'c' &&
        ov.front() == *ov.begin() &&
        ov.back() == 's' &&
        ov.back() == *(ov.end() - 1) &&
        ov.data() == ov.base()
    );
 
    std::cout << "sizeof(ov): " << sizeof ov << '\n' // typically equal to sizeof(R)
              << "range-for: ";
    for (const char ch : ov)
        std::cout << ch;
    std::cout << '\n';
 
    std::ranges::owning_view<std::string> ov2;
    assert(ov2.empty());
//  ov2 = ov; // compile-time error: copy assignment operator is deleted
    ov2 = std::move(ov); // OK
    assert(ov2.size() == 6);
}

Mögliche Ausgabe

sizeof(ov): 32
range-for: cosmos

[edit] Siehe auch

ein view der Elemente eines anderen range
(Klassen-Template) [edit]
ein view, der alle Elemente eines range enthält
(Alias-Template) (Range-Adaptor-Objekt)[edit]