다음을 통해 공유


subrange 클래스(C++ 표준 라이브러리)

시작 반복기 및 sentinel에 정의된 범위 요소의 일부 보기를 제공합니다.

구문

template<input_or_output_iterator I, sentinel_for<I> S, subrange_kind K>
  requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>)
class subrange : public view_interface<subrange<I, S, K>>

템플릿 매개 변수

I
시작 반복기 형식입니다. 이 input_or_output_iterator 개념은 모든 요소를 읽을 수 있는 반복기임을 보장 I 합니다.

K
하위 범위의 종류: 크기가 작은 하위 범위를 지정하는 데 사용합니다 subrange_kind::sized . 반복기와 sentinel을 빼서 크기를 생성할 수 있는 경우에 사용합니다 sized_sentinel_for<S, I> . 요구 사항은 subrange_kind::sized || !sized_sentinel_for<S, I> 하위 범위 개체에 로컬로 크기를 저장하며, 여기서 지정하는 생성자를 sized_range 사용하거나 , 및 (여기서 지정할 subrange_kind::sized 수 있도록) 생성자를 size iteratorsentinel통해 하위 정렬을 생성 sized_sentinel_for<S, I> 해야 합니다.

S
끝 반복기 형식입니다. 이 sized_sentinel_for 개념을 통해 S 센티넬 I 로 사용할 수 있으며, 센티넬과 현재 반복기 위치 I 사이의 거리를 일정한 시간에 계산할 수 있습니다.

특성 보기

다음 항목에 대한 설명은 클래스 특성 보기를 참조 하세요.

특성 설명
범위 어댑터 views::counted
기본 범위 모든 범위
요소 형식 iter_reference_t<I>
반복기 범주 보기 범주와 동일 I
크기 Ksubrange::sized인 경우
반복 const가능 복사 가능한 경우 I
공통 범위 S 동일한 형식인 경우 I 입니다.
빌린 범위

멤버

멤버 함수 설명
생성자C++20 를 생성합니다 subrange.
operator PairLikeC++20 subrange 쌍과 유사한 형식으로 변환합니다.
advanceC++20 반복기를 지정된 거리를 이동합니다.
begin 첫 번째 요소에 대한 반복기를 가져옵니다.
emptyC++20 비어 있는지 테스트 subrange 합니다.
endC++20 의 끝에 있는 sentinel을 가져옵니다 subrange.
nextC++20 subrange 복사본을 만들지만 저장된 반복기를 사용하여 지정된 거리를 앞으로 이동합니다.
prevC++20 subrange 복사본을 만들지만 저장된 반복기를 사용하여 지정된 거리를 뒤로 이동했습니다.
sizeC++20 요소 수를 가져옵니다.
에서 상속됨 view_interface 설명
backC++20 마지막 요소를 가져옵니다.
dataC++20 첫 번째 요소에 대한 포인터를 가져옵니다.
frontC++20 첫 번째 요소를 가져옵니다.
operator[]C++20 지정된 위치에 있는 요소를 가져옵니다.
operator boolC++20 비어 있는지 테스트 subrange 합니다.

설명

A subrange 는 시작 및 끝 반복기가 있지만 대신 단일 개체를 전달하려는 경우에 유용합니다. 예를 들어 범위 어댑터를 호출하려고 하지만 시작 및 종료 반복기가 있는 경우 이를 래핑하고 범위 어댑터에 전달할 subrangesubrange 있습니다.

요구 사항

헤더: <ranges> (C++20 이후)

네임스페이스: std::ranges

컴파일러 옵션: /std:c++20 이상이 필요합니다.

생성자

subrange을 만듭니다.

1) subrange() requires default_initializable<I> = default;
2) template <Convertible_to_non_slicing<I> It>
    constexpr subrange(It begin, S end) requires (!Store_size);
3) template <Convertible_to_non_slicing<I> It>
    constexpr subrange(It begin, S end, const Size_type size) requires (K == subrange_kind::sized);
4) template <Not_same_as<subrange> rg>
    requires borrowed_range<rg>
        && Convertible_to_non_slicing<iterator_t<rg>, I>
        && convertible_to<sentinel_t<rg>, S>
    constexpr subrange(rg&& r) requires (!_Store_size || sized_range<rg>);
5) template <borrowed_range rg>
        requires Convertible_to_non_slicing<iterator_t<rg>, I> && convertible_to<sentinel_t<rg>, S>
    constexpr subrange(rg&& r, const _Size_type sizeHint) requires (K == subrange_kind::sized)

매개 변수

begin
하위 범위의 첫 번째 요소를 가리키는 반복기입니다.

end
하위 범위의 끝을 가리키는 Sentinel입니다. 가리키는 요소는 하위 범위에서 포함되지 않습니다.

sizeHint
요소 범위의 크기입니다. 멤버 함수를 최적화 size 하는 데 사용되며, 형식이 모델링sized_sentinel_for되지 않는 반복기 및 sentinel에서 크기를 subrange 조정하려는 경우에 필요합니다.

템플릿 매개 변수 형식에 대한 자세한 내용은 템플릿 매개 변수를 참조 하세요.

반환 값

subrange 인스턴스입니다.

설명

1) 기본값은 저장된 반복기와 sentinel을 생성합니다. 크기 힌트는 0으로 설정됩니다.
2) 반복기와 end sentinel을 저장된 반복기 및 sentinel로 이동하는 begin 데 사용됩니다std::move().
3) 첫 번째 인수와 두 번째 인수 사이의 거리와 std::move(begin)같아야 하는 저장된 반복기, 저장된 센티넬 std::move(end)및 저장된 크기 힌트를 사용하여 size초기화합니다.
4) subrange 범위에서 생성합니다.
5) 동작이 정의되지 않은 경우 szHint != ranges::distance(rg)

범위 어댑터에서 counted .를 subrange만들 수 있습니다. 해당 어댑터는 시작 반복기와 개수를 취합니다.

예: counted

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    auto pos5 = std::ranges::find(v, 5);
    auto countedView = std::views::counted(pos5, 5);
    for (auto e : countedView) // outputs 5 6 7 8 9
    {
        std::cout << e << ' ';
    }
    std::cout << '\n';

    // You can pass the range directly if it supports input_or_output_iterator, in which case, the
    // count starts from the first element
    const char chars[] = { 'H','i',' ','t','h','e','r','e' };
    for (char c : std::views::counted(chars, 2))
    {
        std::cout << c; // outputs Hi
    }
}
5 6 7 8 9
Hi

operator PairLike

subrange 모델을 pair-like만드는 형식으로 변환합니다.

template<not-same-as<subrange> PairLike>
requires pair-like-convertible-from<PairLike, const I&, const S&>
constexpr operator PairLike() const;

매개 변수

없음

템플릿 매개 변수 형식에 대한 자세한 내용은 템플릿 매개 변수를 참조 하세요.

반환 값

PairLike 저장된 반복기 및 sentinel을 사용하여 직접 초기화되는 값입니다. 쌍의 마지막 값은 sentinel입니다.

센티넬은 아래 예제와 같이 하위 범위의 마지막 요소를 지났 습니다.

설명

이 변환은 범위를 나타내는 첫 번째, 마지막 쌍을 허용하는 이전 Boost::Ranges 코드에 유용합니다.
이 변환은 하위 정렬을 모델 pair_like또는 다른 형식으로 pair tuple 변환하는 데 유용합니다. 형식의 pair_like 몇 가지 예는 다음과 같습니다.

std::array<T, 2>
std::pair<T, U>
std::ranges::subrange<I, S, K>
std::tuple<T, U>

예: operator PairLike()

// requires /std:c++20 or later
#include <iostream>
#include <ranges>
#include <vector>
#include <utility>

int main()
{
    constexpr int a[] = {0, 1, 2, 3, 4, 5};
    std::ranges::subrange rg(a);
    rg.advance(2);
    const std::pair<const int*, const int*> p = rg;
    for (auto e : rg)
    {
        std::cout << e << ' ';
    }

    // because the sentinel points after the last element, subtract one to get the last element
    std::cout << '\n' << *p.first << ':' << *(p.second - 1) << '\n'; // outputs 2:5
 }
2 3 4 5
2:5

advance

요소별로 nsubrange 반복기를 조정합니다.

constexpr subrange& advance(const iter_difference_t<I> n);

매개 변수

n
반복기를 조정할 요소 수입니다. n 는 양수(앞으로 이동) 또는 양방향인 경우 I 음수(뒤로 이동)일 수 있습니다.

설명

이 함수는 에서 반복기의 subrange현재 상태를 수정합니다.

끝 부분을 지나면 반복기가 끝의 subrangesubrangesentinel로 설정됩니다.
n수를 subrange 사용하여 시작 부분을 지나면 원본 범위에 subrange 요소가 없는 경우 잘못된 매개 변수 예외가 발생합니다.

본보기 advance

// requires /std:c++20 or later
#include <iostream>
#include <ranges>
#include <string>
#include <vector>

void print(const std::string &msg, auto &&v)
{
    std::cout << msg << '\n';
    for (auto& x : v)
    {
        std::cout << x << ' ';
    }
    std::cout << '\n';
}

int main()
{
    std::vector v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    print("Original vector: ", v); // outputs 0 1 2 3 4 5 6 7 8 9 10

    // create a subrange 3 4 5 6
    std::ranges::subrange theSubrange{ std::ranges::find(v,3), std::ranges::find(v, 7) };
    print("The subrange: ", theSubrange); // outputs 3 4 5 6

    auto sr = theSubrange.advance(2); // get a subrange 2 positions to the right of the current iterator location
    print("theSubrange.advance(2): ", sr); // outputs 5 6
    print("Note that subrange's iterator moved during advance(): ", sr); // outputs 5 6
    sr = theSubrange.advance(-3); // Moving before the subrange, but onto a valid element in the original range 
    print("theSubrange.advance(-3): ", sr); // outputs 2 3 4 5 6
}
Original vector:
0 1 2 3 4 5 6 7 8 9 10
The subrange:
3 4 5 6
theSubrange.advance(2):
5 6
Note that subrange's iterator moved during advance():
5 6
theSubrange.advance(-3):
2 3 4 5 6

begin

에서 첫 번째 요소에 대한 반복기를 가져옵니다 subrange.

1) constexpr I begin() const requires copyable<I>;
2) [[nodiscard]] constexpr I begin() requires (!std::copyable<I>);

매개 변수

없음.

반환 값

의 첫 번째 요소를 subrange가리키는 반복기입니다. 반복기를 복사할 수 없는 경우 .와 함께 std::move()반환됩니다. 반복기가 이동되면 저장된 반복기의 상태는 이동 생성자의 I구현에 따라 달라집니다.

요소가 10, 20 및 30인 벡터 그림입니다. 첫 번째 요소는 10을 포함하며 begin()이라는 레이블이 지정됩니다. 마지막 요소는 30을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 마지막 요소 뒤의 허수 상자는 sentinel을 나타내며 end()라는 레이블이 지정됩니다.

empty

비어 있는지 테스트 subrange 합니다.

constexpr bool empty() const;

매개 변수

없음.

반환 값

요소가 없으면 subrange 반환 true 합니다. 그렇지 않으면 false을(를) 반환합니다.

end

의 끝에 있는 sentinel을 가져옵니다. subrange

[[nodiscard]] constexpr S end() const;

매개 변수

없음.

반환 값

다음의 마지막 요소 뒤에 있는 sentinel입니다 subrange.

요소가 10, 20 및 30인 벡터 그림입니다. 첫 번째 요소는 10을 포함하며 begin()이라는 레이블이 지정됩니다. 마지막 요소는 30을 포함하며 '마지막 요소'라는 레이블이 지정됩니다. 마지막 요소 뒤의 허수 상자는 sentinel을 나타내며 end()라는 레이블이 지정됩니다.

sentinel은 저장된 sentinel에서 복사 생성됩니다.

next

subrange 복사본을 만들지만 저장된 반복기를 사용하여 지정된 거리를 앞으로 이동합니다.

1) [[nodiscard]] constexpr subrange next(iter_difference_t<I> n = 1) const & requires forward_iterator<I>;
2) [[nodiscard]] constexpr subrange next(iter_difference_t<I> n = 1) &&;

매개 변수

n
반복기를 앞으로 이동할 요소 수입니다. 기본값은 1입니다. 양수여야 합니다.

반환 값

**nth 요소에서 시작의 subrange 복사본을 반환합니다.

설명

next() 와 달리 advance()원래subrange에 저장된 반복기의 위치는 변경되지 않습니다. 반환 subrange 된 요소에는 원래 하위 범위의 모든 요소가 있지만 반복기는 다른 위치에 있습니다.

1) 반환 값은 다음과 같습니다.

auto tmp = *this;
tmp.advance(n);
return tmp;

2) 반환 값은 다음과 같습니다.

advance(n);
return std::move(*this);

예: next

// requires /std:c++20 or later
#include <iostream>
#include <ranges>
#include <string>
#include <vector>

void print(const std::string &msg, auto &&v)
{
    std::cout << msg << '\n';
    for (auto& x : v)
    {
        std::cout << x << ' ';
    }
    std::cout << '\n';
}

int main()
{
    std::vector v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    print("Original vector:", v); // 0 1 2 3 4 5 6 7 8 9 10

    // create a subrange from the front of v up to (but not including) the element 7
    std::ranges::subrange theSubrange{ std::ranges::find(v,1), std::ranges::find(v, 7) };
    print("The subrange:", theSubrange); // 1 2 3 4 5 6

    auto forward = theSubrange.advance(3); // get a subrange 3 positions to the right of the current iterator location
    print("theSubrange.advance(3):", forward); // 4 5 6

    // prev()
    auto previous = theSubrange.prev(2); // move back 2
    print("theSubrange.prev(2):", previous); // 2 3 4 5 6    
    print("Note that the subrange's iterator did *not* move during prev():", theSubrange); // 4 5 6
}
Original vector:
0 1 2 3 4 5 6 7 8 9 10
The subrange:
1 2 3 4 5 6
theSubrange.next(3):
4 5 6
Note that the original subrange's iterator did *not* move during next():
1 2 3 4 5 6

prev

subrange복사본을 만들지만 저장된 반복기가 지정된 거리를 뒤로 이동했습니다.

[[nodiscard]] constexpr subrange prev(std::iter_difference_t<I> n = 1 ) const
    requires std::bidirectional_iterator<I>;

매개 변수

n
반복기를 다시 이동할 요소 수입니다. 기본값은 1입니다. 양수여야 합니다.

반환 값

subrange 반복기가 요소를 뒤로 n 이동한 상태에서 복사본을 반환합니다.

설명

prev() 와 달리 advance()원래subrange에 저장된 반복기의 위치는 변경되지 않습니다.
반환 subrange 된 요소에는 원래 하위 범위의 모든 요소가 있지만 반복기는 다른 위치에 있습니다. 반환 값은 다음과 같이 생각할 수 있습니다.

auto tmp = *this;
tmp.advance(-n);
return tmp;

본보기 prev

// requires /std:c++20 or later
#include <iostream>
#include <ranges>
#include <string>
#include <vector>

void print(const std::string &msg, auto &&v)
{
    std::cout << msg << '\n';
    for (auto& x : v)
    {
        std::cout << x << ' ';
    }
    std::cout << '\n';
}

int main()
{
    std::vector v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    print("Original vector:", v); // 0 1 2 3 4 5 6 7 8 9 10

    // create a subrange from the front of v up to (but not including) the element 7
    std::ranges::subrange theSubrange{std::ranges::find(v,1), std::ranges::find(v, 7)};
    print("The subrange: ", theSubrange); // 1 2 3 4 5 6

    auto forward = theSubrange.advance(3); // get a subrange 3 positions to the right of the current iterator location
    print("theSubrange.advance(3):", forward); // 4 5 6

    // prev()
    auto previous = theSubrange.prev(2); // move back 2
    print("theSubrange.prev(2):", previous); // 2 3 4 5 6    
    print("Note that the subrange's iterator did *not* move during prev():", theSubrange); // 4 5 6
}
Original vector:
0 1 2 3 4 5 6 7 8 9 10
The subrange:
1 2 3 4 5 6
theSubrange.advance(3):
4 5 6
theSubrange.prev(2):
2 3 4 5 6
Note that the subrange's iterator did *not* move during prev():
4 5 6

size

의 요소 subrange수를 가져옵니다.

constexpr size() const
    requires (K == ranges::subrange_kind::sized);

매개 변수

없음.

반환 값

subrange의 요소 수입니다.

크기가 저장되지 않은 경우( 지정된 상태로 만들어 K == ranges::subrange_kind::sized 지고 std::sized_sentinel_for<S, I> 충족되지 않는 경우subrange) 크기는 시작 반복기와 끝 반복기 사이의 거리로 반환됩니다.

예를 들어 반복기의 begin advance위치를 변경하면 보고된 크기가 변경됩니다.

참고 항목

<ranges>
counted
클래스 보기