std::ranges::views::chunk, std::ranges::chunk_view
| 헤더에 정의 <ranges>
|
||
template< ranges::view V >
requires ranges::input_range<V>
class chunk_view
: public ranges::view_interface<chunk_view<V>>
|
(1) | (C++23부터) |
template< ranges::view V >
requires ranges::forward_range<V>
class chunk_view<V>
: public ranges::view_interface<chunk_view<V>>
|
(2) | (C++23부터) |
namespace views {
inline constexpr /* unspecified */ chunk = /* unspecified */;
}
|
(3) | (C++23부터) |
| 호출 시그니처 |
||
template< ranges::viewable_range R >
constexpr ranges::view auto chunk( R&& r, ranges::range_difference_t<R> n );
|
(C++23부터) | |
template< class DifferenceType >
constexpr /*range adaptor closure*/ chunk( DifferenceType&& n );
|
(C++23부터) | |
| 도우미 템플릿 |
||
template< class I >
constexpr I /*div-ceil*/( I num, I denom );
|
(4) | (설명 전용*) |
chunk_view는 view와 숫자 n을 받아 원본 뷰의 뷰 범위(청크 )를 생성하며, 각 청크 는 (마지막 청크를 제외하고) 크기가 n입니다. 이러한 청크는 원본 뷰 요소의 비중첩 연속 하위 범위이며 순서대로입니다.
원본 뷰의 크기를 s이라 하자. s이 n의 배수가 아니면, 마지막으로 생성된 뷰의 크기는 정확히 s % n (나머지)이다. 그렇지 않으면 각 청크 의 크기(마지막 포함)는 n이다.
생성된 뷰의 크기는 /*div-ceil*/(s)이다.
만약 n가 0보다 크지 않으면 동작은 정의되지 않는다.
V가 forward_range 이상을 모델링하는 경우를 위한 부분 특수화. 모델 common_range 기본 뷰 V가 forward_range, common_range, 그리고 sized_range 또는 bidirectional_range가 아닌 경우.views::chunk는 RangeAdaptorObject를 나타낸다. 하위 표현식 e와 n이 주어지면, 표현식 views::chunk(e, n)는 표현식-동등하게 chunk_view(e, n)이다.num을 denom로 나눈 몫보다 작지 않은 가장 작은 정수 값을 계산한다. 다음 코드와 동등:
I r = num / denom;
if (num % denom)
++r;
return r;
데이터 멤버
| 멤버 | 설명 |
V
base_
|
기반 뷰
( 설명 전용 멤버 객체* ) |
ranges::
range_difference_t
<
V
>
n_
|
"청크" 크기
( 설명 전용 멤버 객체* ) |
|
|
ranges::
range_difference_t
<
V
>
remainder_
(조건부로 존재) |
현재 "청크"에 남아 있는 요소의 수
( 설명 전용 멤버 객체* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
current_
(조건부로 존재) |
현재 기반 반복자를 캐시하는 객체
( 설명 전용 멤버 객체* ) |
멤버 함수
chunk_view
를 생성합니다
(public member function) |
|
|
기본 (적응된) 뷰의 복사본을 반환합니다
(public member function) |
|
|
시작을 가리키는 반복자를 반환합니다
(public member function) |
|
|
끝을 가리키는 반복자나 센티널을 반환합니다
(public member function) |
|
기본 (적응된) 범위가
sized_range
를 만족할 때만 제공되며, 요소의 개수를 반환합니다
(public member function) |
|
|
(C++26)
|
결과
approximately_sized_range
의 대략적인 크기를 반환합니다
(public member function) |
에서 상속됨 ranges::view_interface | |
| 는 파생된 뷰가 비어 있는지 여부를 반환합니다. 단, 다음을 만족하는 경우에만 제공됩니다: sized_range 또는 forward_range ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
(C++23) |
는 범위의 시작을 가리키는 상수 반복자를 반환합니다. ( std::ranges::view_interface<D>의 공개 멤버 함수)
|
(C++23) |
는 범위의 상수 반복자에 대한 센티널을 반환합니다. ( std::ranges::view_interface<D>의 공개 멤버 함수)
|
| 는 파생된 뷰가 비어 있지 않은지 여부를 반환합니다. 단, ranges::empty가 적용 가능한 경우에만 제공됩니다. ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
| 는 파생된 뷰의 첫 번째 요소를 반환합니다. 단, forward_range ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
| 는 파생된 뷰의 마지막 요소를 반환합니다. 단, bidirectional_range와 common_range ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
는 파생된 뷰에서 n번째 요소를 반환합니다. 단, random_access_range ( std::ranges::view_interface<D>의 공개 멤버 함수)
| |
추론 가이드
중첩 클래스
|
(C++23)
|
V
가
input_range
를 모델링할 때의 출력("청크 단위") 반복자 타입
(
1
)
( 설명 전용 멤버 클래스* ) |
|
(C++23)
|
V
가
input_range
를 모델링할 때의 내부("요소 단위") 반복자 타입
(
1
)
( 설명 전용 멤버 클래스* ) |
|
(C++23)
|
V
가
forward_range
를 모델링할 때의 반복자 타입
(
2
)
( 설명 전용 멤버 클래스 템플릿* ) |
헬퍼 템플릿
|
template
<
class
V
>
constexpr
bool
ranges::
enable_borrowed_range
<
chunk_view
<
V
>>
=
|
(C++23부터) | |
ranges::enable_borrowed_range
의 이 특수화는 기본 뷰
V
가
forward_range
와
borrowed_range
를 모두 만족할 때
chunk_view
가
borrowed_range
를 만족하도록 합니다.
참고 사항
만약
V
가
input_range
(
1
)
를 모델링하면,
chunk_view
의 반복자는 전용 타입을 가집니다:
outer_iterator::value_type
는 그 자체로 입력 뷰입니다.
만약
V
가
forward_range
또는 그 이상의 개념을 모델링한다면
(
2
)
,
chunk_view
는
views::take
에게
value_type
을 위임합니다.
만약
V
가
bidirectional_range
또는 더 강력한 범위를 모델링하는 경우
(
2
)
, 마지막 청크의 크기를 올바르게 계산하기 위해(끝
iterator
에서) 기본 범위 타입
V
가
sized_range
여야 합니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_ranges_chunk
|
202202L
|
(C++23) |
std::ranges::chunk_view
|
예제
#include <algorithm> #include <initializer_list> #include <iostream> #include <ranges> auto print_subrange = [](std::ranges::viewable_range auto&& r) { std::cout << '['; for (int pos{}; auto elem : r) std::cout << (pos++ ? " " : "") << elem; std::cout << "] "; }; int main() { const auto v = {1, 2, 3, 4, 5, 6}; for (const unsigned width : std::views::iota(1U, 2U + v.size())) { auto const chunks = v | std::views::chunk(width); std::cout << "chunk(" << width << "): "; std::ranges::for_each(chunks, print_subrange); std::cout << '\n'; } }
출력:
chunk(1): [1] [2] [3] [4] [5] [6] chunk(2): [1 2] [3 4] [5 6] chunk(3): [1 2 3] [4 5 6] chunk(4): [1 2 3 4] [5 6] chunk(5): [1 2 3 4 5] [6] chunk(6): [1 2 3 4 5 6] chunk(7): [1 2 3 4 5 6]
참조문헌
- C++23 표준 (ISO/IEC 14882:2024):
-
- 26.7.28 청크 뷰 [range.chunk]
참고 항목
view
를 주어진 조건자가
false
를 반환하는 각 인접 요소 쌍 사이에서 부분 범위로 분할합니다
(클래스 템플릿) (범위 어댑터 객체) |
|
적응된
view
의 인접 요소들에 대한 참조 튜플로 구성된
view
(클래스 템플릿) (범위 어댑터 객체) |
|
|
(C++23)
|
M
번째
요소가 다른
view
의 M
번째
부터 (M + N - 1)
번째
요소에 대한
view
인
view
(클래스 템플릿) (범위 어댑터 객체) |