owning_view
Klasse (C++-Standardbibliothek)
Eine Ansicht, die den Besitz der Elemente in einem anderen Bereich übernimmt.
Syntax
template<range R>
requires std::movable<R> && (!is-initializer-list<R>)
class owning_view : public ranges::view_interface<owning_view<R>>;
Vorlagenparameter
R
Der Typ des zugrunde liegenden Bereichs.
Eigenschaften der Ansicht
Eine Beschreibung der folgenden Einträge finden Sie unter Anzeigen von Klassenmerkmalen
Merkmal | Beschreibung |
---|---|
Range Adaptor | views::all |
Zugrunde liegender Bereich | Muss erfüllen input_range oder höher |
Elementtyp | Identisch mit dem zugrunde liegenden Bereich |
Iteratorkategorie anzeigen | Identisch mit dem zugrunde liegenden Bereich |
Größer eingestellt | Nur, wenn der zugrunde liegende Bereich erfüllt ist sized_range |
Ist const -iterierbar |
Nur, wenn der zugrunde liegende Bereich erfüllt ist const-iterable |
Allgemeiner Bereich | Nur, wenn der zugrunde liegende Bereich erfüllt ist common_range |
Geliehener Bereich | Nur, wenn der zugrunde liegende Bereich erfüllt ist borrowed_range |
Member
Memberfunktionen | Beschreibung |
---|---|
Konstruktoren | Erstellen eines owning_view . |
base C++20 |
Rufen Sie einen Verweis auf den besitzeigenen Bereich ab. |
begin C++20 |
Rufen Sie einen Iterator zum ersten Element ab. |
data C++20 |
Rufen Sie einen Zeiger auf das erste Element ab. |
empty C++20 |
Testen Sie, ob die Ansicht leer ist. |
end C++20 |
Rufen Sie den Sentinel am Ende der Ansicht ab. |
size C++20 |
Ruft die Anzahl der Elemente ab. |
operator= |
Weisen Sie den Inhalt von einem anderen owning_view zu dieser Zuweisung zu (verschieben). |
Geerbt von view_interface |
Beschreibung |
back C++20 |
Rufen Sie das letzte Element ab. |
front C++20 |
Rufen Sie das erste Element ab. |
operator[] C++20 |
Rufen Sie das Element an der angegebenen Position ab. |
operator bool C++20 |
Testen Sie, ob die Ansicht nicht leer ist. |
Hinweise
Die beste Methode zum Erstellen eines Elements owning_view
ist die Verwendung des views::all
Bereichsadapters. Bereichsadapter sind die beabsichtigte Möglichkeit zum Erstellen von Ansichtsklassen. Die Ansichtstypen werden für den Fall verfügbar gemacht, dass Sie ihren eigenen benutzerdefinierten Ansichtstyp erstellen möchten.
Obwohl diese Klasse ihre Elemente besitzt, ist es nicht teuer zu konstruieren, da der zugrunde liegende Bereich mit std::move()
verschoben wird.
Diese Ansicht ist nützlich, wenn Sie einen Bereich benötigen, der nicht von der Lebensdauer des Containers abhängt, der die Elemente bereitstellt.
Anforderungen
Header: <ranges>
(seit C++20)
Namespace:std::ranges
Compileroption: /std:c++20
oder höher ist erforderlich.
Konstruktoren
Erstellen Sie eine Instanz von owning_view
.
1) owning_view() requires default_initializable<R> = default;
2) constexpr owning_view(R&& rg);
3) owning_view(const owning_view& v) = delete; // no copy constructor
4) owning_view(const owning_view&& v) = default; // move constructor
Parameter
rg
Der Bereich, der in den owning_view
Bereich verschoben werden soll.
v
Der owning_view
Umstieg auf das neue owning_view
.
Informationen zu Vorlagenparametertypen finden Sie unter Vorlagenparameter.
Hinweise
1) Der Standardkonstruktor erstellt einen standardinitialisierten owning_view
.
2) Verschieben von Konstrukten aus owning_view
rg
.
3) Eine owning_view
kann nicht kopiert werden, nur verschoben.
4) Erstellen Sie das owning_view
aus einem anderen owning_view
.
Beispiel: owning_view
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
#include <utility>
int main()
{
std::vector<int> v = {1,2,3,4,5,6,7,8,9,10};
auto myOwningView = std::views::all(std::move(v)); // create an owning_view from a moved vector
std::cout << v.size() << '\n'; // outputs 0 because myOwningView now owns the elements
std::cout << myOwningView.size() << '\n'; // outputs 10
std::vector<int> v2 = {1,2,3,4,5};
std::ranges::owning_view<std::vector<int>> ov2{std::move(v2)};
std::cout << v2.size() << '\n'; // outputs 0 because ov2 now owns the elements
std::cout << ov2.size() << '\n'; // outputs 5
}
0
10
0
5
base
Ruft einen Verweis auf den zugrunde liegenden Bereich ab.
1) constexpr R& base() & noexcept { return r_; }
2) constexpr const R& base() const & noexcept { return r_; }
3) constexpr R&& base() && noexcept { return std::move(r_); }
4) constexpr const R&& base() const && noexcept { return std::move(r_); }
Parameter
Keine
Rückgabewert
Ein Verweis auf den zugrunde liegenden Bereich, rufen Sie ihn rg
auf.
Für 1 & 2 wird der zugrunde liegende Bereich über return rg;
Für 3 & 4 wird der zugrunde liegende Bereich über std::move(rg);
begin
Rufen Sie einen Iterator zum ersten Element in der Ansicht ab.
constexpr iterator_t<R> begin();
constexpr auto begin() const requires range<const R>;
Parameter
Keine
Rückgabewert
Ein Iterator, der auf das erste Element in der Ansicht zeigt:
data
Rufen Sie einen Zeiger auf das erste Element in der Ansicht ab.
constexpr auto data()
requires std::contiguous_iterator<ranges::iterator_t<R>>;
constexpr auto data() const
requires std::contiguous_iterator<ranges::iterator_t<const R>>;
Parameter
Keine
Rückgabewert
Ein Zeiger auf das erste Element in der Ansicht.
Hinweise
Der zugrunde liegende Bereich muss erfüllt sein contiguous_range
.
empty
Testen Sie, ob die Ansicht leer ist.
constexpr bool empty();
constexpr bool empty() const;
Parameter
Keine
Rückgabewert
Gibt zurück true
, wenn der zugrunde liegende Bereich keine Elemente enthält. Andernfalls wird false
zurückgegeben.
end
Rufen Sie den Sentinel am Ende der Ansicht ab.
constexpr sentinel_t<R> end();
constexpr auto end() const requires range<const R>
Rückgabewert
Der Sentinel, der auf das letzte Element in der Ansicht folgt:
size
Ruft die Anzahl der Elemente in der Ansicht ab.
constexpr auto size() requires ranges::sized_range<R>;
constexpr auto size() const requires ranges::sized_range<const R>;
Parameter
Keine
Rückgabewert
Die Anzahl der Elemente in der Ansicht.
operator=
Weisen Sie den Inhalt von einem anderen owning_view
zu dieser Zuweisung zu (verschieben).
owning_view& operator=(owning_view&&) = default;
Parameter
The owning_view
to assign (move) to this one.
Rückgabewert
*this
Bemerkungen
Eine owning_view
Datei kann nicht kopiert werden, nur verschoben.
Beispiel: operator=
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v1 = {1,2,3};
std::ranges::owning_view<std::vector<int>> ov1{std::move(v1)};
std::vector<int> v2 = {4,5,6};
std::ranges::owning_view<std::vector<int>> ov2{std::move(v2)};
// operator=
ov2 = std::move(ov1);
// ov1 took ownership of v1, so v1 is empty
// ov2 took ownership of v2, so v2 is empty
// ov2 then took ownership of ov1, so ov1 is empty
// ov2 now owns the elements 1, 2, 3
std::cout << std::boolalpha << "v1.empty():" << v1.empty() << " ov1.empty():" << ov1.empty() << '\n'; // v1.empty():true ov1.empty():true
std::cout << "v2.empty():" << v2.empty() << " ov2.size():" << ov2.size() << '\n'; // v2.empty():true ov2.size():3
for (auto e : ov2)
{
std::cout << e << ' '; // 1 2 3
}
}
v1.empty():true ov1.empty():true
v2.empty():true ov2.size():3
1 2 3