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
iterator
sentinel
통해 하위 정렬을 생성 sized_sentinel_for<S, I>
해야 합니다.
S
끝 반복기 형식입니다. 이 sized_sentinel_for
개념을 통해 S
센티넬 I
로 사용할 수 있으며, 센티넬과 현재 반복기 위치 I
사이의 거리를 일정한 시간에 계산할 수 있습니다.
특성 보기
다음 항목에 대한 설명은 클래스 특성 보기를 참조 하세요.
특성 | 설명 |
---|---|
범위 어댑터 | views::counted |
기본 범위 | 모든 범위 |
요소 형식 | iter_reference_t<I> |
반복기 범주 보기 | 범주와 동일 I |
크기 | K 가 subrange::sized 인 경우 |
반복 const 가능 |
복사 가능한 경우 I |
공통 범위 | S 동일한 형식인 경우 I 입니다. |
빌린 범위 | 예 |
멤버
멤버 함수 | 설명 |
---|---|
생성자C++20 | 를 생성합니다 subrange . |
operator PairLike C++20 |
subrange 쌍과 유사한 형식으로 변환합니다. |
advance C++20 |
반복기를 지정된 거리를 이동합니다. |
begin |
첫 번째 요소에 대한 반복기를 가져옵니다. |
empty C++20 |
비어 있는지 테스트 subrange 합니다. |
end C++20 |
의 끝에 있는 sentinel을 가져옵니다 subrange . |
next C++20 |
이 subrange 복사본을 만들지만 저장된 반복기를 사용하여 지정된 거리를 앞으로 이동합니다. |
prev C++20 |
이 subrange 복사본을 만들지만 저장된 반복기를 사용하여 지정된 거리를 뒤로 이동했습니다. |
size C++20 |
요소 수를 가져옵니다. |
에서 상속됨 view_interface |
설명 |
back C++20 |
마지막 요소를 가져옵니다. |
data C++20 |
첫 번째 요소에 대한 포인터를 가져옵니다. |
front C++20 |
첫 번째 요소를 가져옵니다. |
operator[] C++20 |
지정된 위치에 있는 요소를 가져옵니다. |
operator bool C++20 |
비어 있는지 테스트 subrange 합니다. |
설명
A subrange
는 시작 및 끝 반복기가 있지만 대신 단일 개체를 전달하려는 경우에 유용합니다. 예를 들어 범위 어댑터를 호출하려고 하지만 시작 및 종료 반복기가 있는 경우 이를 래핑하고 범위 어댑터에 전달할 subrange
수 subrange
있습니다.
요구 사항
헤더: <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
요소별로 n
이 subrange
반복기를 조정합니다.
constexpr subrange& advance(const iter_difference_t<I> n);
매개 변수
n
반복기를 조정할 요소 수입니다. n
는 양수(앞으로 이동) 또는 양방향인 경우 I
음수(뒤로 이동)일 수 있습니다.
설명
이 함수는 에서 반복기의 subrange
현재 상태를 수정합니다.
끝 부분을 지나면 반복기가 끝의 subrange
subrange
sentinel로 설정됩니다.
음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
구현에 따라 달라집니다.
empty
비어 있는지 테스트 subrange
합니다.
constexpr bool empty() const;
매개 변수
없음.
반환 값
요소가 없으면 subrange
반환 true
합니다. 그렇지 않으면 false
을(를) 반환합니다.
end
의 끝에 있는 sentinel을 가져옵니다. subrange
[[nodiscard]] constexpr S end() const;
매개 변수
없음.
반환 값
다음의 마지막 요소 뒤에 있는 sentinel입니다 subrange
.
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입니다. 양수여야 합니다.
반환 값
**n
th 요소에서 시작의 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
위치를 변경하면 보고된 크기가 변경됩니다.