共用方式為


owning_view class (C++標準連結庫)

檢視,接受另一個範圍中項目的擁有權。

語法

template<range R>
    requires std::movable<R> && (!is-initializer-list<R>)
class owning_view : public ranges::view_interface<owning_view<R>>;

範本參數

R
基礎範圍的型別。

檢視特性

如需下列專案的描述,請參閱 檢視類別特性

特性 描述
範圍配接器 views::all
基礎範圍 必須滿足 input_range 或更新版本
項目類型 與基礎範圍相同
檢視反覆運算器類別 與基礎範圍相同
大小 只有在基礎範圍滿足時才 sized_range
const-iterable 只有在基礎範圍滿足時才 const-iterable
通用範圍 只有在基礎範圍滿足時才 common_range
借用範圍 只有在基礎範圍滿足時才 borrowed_range

成員

成員函式 說明
建構函式 owning_view建構 。
baseC++20 取得自有範圍的參考。
beginC++20 取得第一個專案的反覆運算器。
dataC++20 取得第一個專案的指標。
emptyC++20 測試檢視是否為空白。
endC++20 取得檢視結尾的 sentinel。
sizeC++20 取得項目數目。
operator= 將內容從另一個 owning_view 指派給這個內容。
繼承自 view_interface 說明
backC++20 取得最後一個專案。
frontC++20 取得第一個專案。
operator[]C++20 取得位於指定位置的專案。
operator boolC++20 測試檢視是否不是空的。

備註

建立 owning_view 的最佳方式是使用 views::all 範圍配接器。 範圍配接器是建立檢視類別的預定方式。 如果您想要建立自己的自定義檢視類型,則會公開檢視類型。

雖然這個類別擁有其元素,但建構並不昂貴,因為基礎範圍是使用 std::move()移動。

當您想要不相依於提供元素之容器存留期的範圍時,此檢視很有用。

需求

標頭: <ranges> (自C++20起)

命名空間std::ranges

需要編譯程式選項:/std:c++20或更新版本。

建構函式

建立 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

參數

rg
要移至 owning_view的範圍。

v
owning_view要移至新 owning_view的 。

如需範本參數類型的相關信息,請參閱 範本參數

備註

1) 預設建構函式會建立預設初始化的 owning_view
2) 移動會 owning_viewrg建構 。
3) 無法複製, owning_view 只能移動。
4) 從另一個 owning_view建構 owning_view

範例: 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

取得基礎範圍的參考。

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_); }

參數

無。

傳回值

基礎範圍的參考,稱為 rg
針對 1 和 2,基礎範圍會透過 傳回 return rg;
針對 3 和 4,基礎範圍會透過 傳回 std::move(rg);

begin

取得檢視中第一個專案的反覆運算器。

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

參數

無。

傳回值

指向檢視中第一個專案的反覆運算器:

具有元素 10、20 和 30 的向量圖片。第一個元素包含 10,且標示為 begin()。最後一個專案包含 30 個,且標示為「最後一個專案」。最後一個專案後面的虛方塊表示 sentinel 且標示為 end()。

data

取得檢視中第一個專案的指標。

constexpr auto data()
    requires std::contiguous_iterator<ranges::iterator_t<R>>;
constexpr auto data() const
    requires std::contiguous_iterator<ranges::iterator_t<const R>>;

參數

無。

傳回值

檢視中第一個專案的指標。

備註

基礎擁有的範圍必須滿足 contiguous_range

empty

測試檢視是否為空白。

constexpr bool empty();
constexpr bool empty() const;

參數

無。

傳回值

如果基礎範圍沒有專案,則傳 true 回 。 否則傳回 false

end

取得檢視結尾的 sentinel。

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

傳回值

檢視中最後一個專案後面的 sentinel:

具有元素 10、20 和 30 的向量圖片。第一個元素包含 10,且標示為 begin()。最後一個專案包含 30 個,且標示為「最後一個專案」。最後一個專案後面的虛方塊表示 sentinel 且標示為 end()。

size

取得檢視中的項目數目。

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

參數

無。

傳回值

檢視中的項目數目。

operator=

將內容從另一個 owning_view 指派給這個內容。

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

參數

owning_view要指定(移動)給這個的 。

傳回值

*this

備註

owning_view無法複製,只能移動。

範例: 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

另請參閱

<ranges>
all 範圍配接器
檢視類別