다음을 통해 공유


owning_view 클래스(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가능 기본 범위가 충족되는 경우에만 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) Move는 fromrgowning_view 생성합니다.
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 범위 어댑터
클래스 보기