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 . |
base C++20 |
소유된 범위에 대한 참조를 가져옵니다. |
begin C++20 |
첫 번째 요소에 대한 반복기를 가져옵니다. |
data C++20 |
첫 번째 요소에 대한 포인터를 가져옵니다. |
empty C++20 |
보기가 비어 있는지 테스트합니다. |
end C++20 |
보기의 끝에 있는 sentinel을 가져옵니다. |
size C++20 |
요소 수를 가져옵니다. |
operator= |
콘텐츠를 다른 owning_view 콘텐츠에서 이 콘텐츠로 할당(이동)합니다. |
에서 상속됨 view_interface |
설명 |
back C++20 |
마지막 요소를 가져옵니다. |
front C++20 |
첫 번째 요소를 가져옵니다. |
operator[] C++20 |
지정된 위치에 있는 요소를 가져옵니다. |
operator bool C++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는 fromrg
을 owning_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>;
매개 변수
없음.
반환 값
뷰의 첫 번째 요소를 가리키는 반복기:
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입니다.
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