std::ranges:: views:: chunk, std::ranges:: chunk_view
|
헤더 파일에 정의됨
<ranges>
|
||
|
template
<
ranges::
view
V
>
requires
ranges::
input_range
<
V
>
|
(1) | (C++23부터) |
|
template
<
ranges::
view
V
>
requires
ranges::
forward_range
<
V
>
|
(2) | (C++23부터) |
|
namespace
views
{
inline
constexpr
/* 지정되지 않음 */
chunk
=
/* 지정되지 않음 */
;
|
(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 /*레인지 어댑터 클로저*/ 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
(나머지)이다. 그렇지 않다면, 마지막 뷰를 포함한 각
chunk
의 크기는
n
이다.
생성된 뷰의 크기는 /*div-ceil*/ ( s ) 입니다.
만약 n 이 0 보다 크지 않으면 동작은 정의되지 않습니다.
V
가
forward_range
이상의 개념을 모델링하는 부분 특수화. 기본 뷰
V
가
forward_range
이고,
common_range
이며,
sized_range
이거나
bidirectional_range
가 아닌 경우
common_range
을 모델링합니다.
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) |
std::ranges::view_interface 로부터 상속됨 |
|
파생 뷰가
sized_range
또는
forward_range
를 만족할 때만 제공되며, 파생 뷰가 비어 있는지 여부를 반환합니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
|
(C++23)
|
범위의 시작을 가리키는 상수 반복자를 반환합니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
(C++23)
|
범위의 상수 반복자에 대한 센티널을 반환합니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
ranges::empty
가 적용 가능할 때만 제공되며, 파생 뷰가 비어 있지 않은지 여부를 반환합니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
파생 뷰가
forward_range
를 만족할 때 제공되며, 파생 뷰의 첫 번째 요소를 반환합니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
파생 뷰가
bidirectional_range
와
common_range
를 만족할 때만 제공되며, 파생 뷰의 마지막 요소를 반환합니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
파생 뷰가
random_access_range
를 만족할 때만 제공되며, 파생 뷰의
n
번째
요소를 반환합니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
추론 가이드
중첩 클래스
|
(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
(클래스 템플릿) (범위 어댑터 객체) |