std::ranges:: views:: chunk_by, std::ranges:: chunk_by_view
|
헤더 파일에 정의됨
<ranges>
|
||
|
template
<
ranges::
forward_range
V,
std::
indirect_binary_predicate
<
iterator_t
<
V
>
,
ranges::
iterator_t
<
V
>>
Pred
>
|
(1) | (C++23부터) |
|
namespace
views
{
inline
constexpr
/* unspecified */
chunk_by
=
/* unspecified */
;
|
(2) | (C++23부터) |
|
호출 시그니처
|
||
|
template
<
ranges::
viewable_range
R,
class
Pred
>
requires
/* see below */
|
(C++23부터) | |
|
template
<
class
Pred
>
constexpr /*range adaptor closure*/ chunk_by ( Pred && pred ) ; |
(C++23부터) | |
chunk_by_view
는
view
와 호출 가능 객체
pred
(이항 조건자)를 취하는 범위 어댑터로, 기본 뷰를 인접한 요소 쌍 사이에서
pred
가
false
를 반환하는 각 지점에서 분할하여 하위 범위(청크)들의
view
를 생성합니다. 이러한 각 쌍의 첫 번째 요소는 이전 청크에 속하고, 두 번째 요소는 다음 청크에 속합니다.
chunk_by_view
는 항상
forward_range
를 모델링하며, 적응된
view
타입이 해당 개념들을 모델링할 경우
bidirectional_range
및/또는
common_range
를 모델링합니다.
chunk_by_view
는
borrowed_range
나
sized_range
를 절대 모델링하지 않습니다.
목차 |
데이터 멤버
| 멤버 | 정의 |
V
base_
|
기반이 되는
view
( 설명 전용 멤버 객체* ) |
movable-box
<Pred>
pred_
|
base_
의 요소들을 분할하는 데 사용되는 predicate를 감싸는 객체
( 설명 전용 멤버 객체* ) |
non-propagating-cache
<iterator>
begin_
|
첫 번째 요소에 대한 iterator를 캐싱하는 객체
( 설명 전용 멤버 객체* ) |
멤버 함수
chunk_by_view
를 생성합니다
(public member function) |
|
|
기본(적응된) view의 복사본을 반환합니다
(public member function) |
|
|
저장된 predicate에 대한 참조를 반환합니다
(public member function) |
|
|
시작 부분을 가리키는 iterator를 반환합니다
(public member function) |
|
|
끝 부분을 가리키는 iterator나 sentinel을 반환합니다
(public member function) |
|
|
다음 subrange의 시작 부분을 가리키는 iterator를 반환합니다
( exposition-only member function* ) |
|
|
이전 subrange의 시작 부분을 가리키는 iterator를 반환합니다
( exposition-only member function* ) |
|
std::ranges::view_interface 로부터 상속됨 |
|
파생된 view가 비어 있는지 여부를 반환합니다.
sized_range
나
forward_range
를 만족할 때만 제공됩니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
|
(C++23)
|
범위의 시작을 가리키는 상수 iterator를 반환합니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
(C++23)
|
범위의 상수 iterator에 대한 sentinel을 반환합니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
파생된 view가 비어 있지 않은지 여부를 반환합니다.
ranges::empty
가 적용 가능할 때만 제공됩니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
파생된 view의 첫 번째 요소를 반환합니다.
forward_range
를 만족할 때 제공됩니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
파생된 view의 마지막 요소를 반환합니다.
bidirectional_range
와
common_range
를 만족할 때만 제공됩니다
(
std::ranges::view_interface<D>
의 public member function)
|
|
추론 가이드
중첩 클래스
|
반복자 타입
( 설명 전용 멤버 클래스 템플릿* ) |
참고 사항
range
개념에서 요구하는 분할 상환 상수 시간 복잡도를 제공하기 위해,
begin()
의 결과는
chunk_by_view
객체 내부에 캐시됩니다. 첫 번째
begin()
호출 이후 기본 범위가 수정되면,
chunk_by_view
객체의 후속 사용에서 직관적이지 않은 동작이 발생할 수 있습니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_ranges_chunk_by
|
202202L
|
(C++23) |
std::ranges::chunk_by_view
|
예제
#include <functional> #include <iostream> #include <ranges> #include <string_view> void print_chunks(auto view, std::string_view separator = ", ") { for (auto const subrange : view) { std::cout << '['; for (std::string_view prefix; auto const& elem : subrange) std::cout << prefix << elem, prefix = separator; std::cout << "] "; } std::cout << '\n'; } int main() { std::initializer_list v1 = {1, 2, 3, 1, 2, 3, 3, 3, 1, 2, 3}; auto fn1 = std::ranges::less{}; auto view1 = v1 | std::views::chunk_by(fn1); print_chunks(view1); std::initializer_list v2 = {1, 2, 3, 4, 4, 0, 2, 3, 3, 3, 2, 1}; auto fn2 = std::ranges::not_equal_to{}; auto view2 = v2 | std::views::chunk_by(fn2); print_chunks(view2); std::string_view v3 = "__cpp_lib_ranges_chunk_by"; auto fn3 = [](auto x, auto y) { return not(x == '_' or y == '_'); }; auto view3 = v3 | std::views::chunk_by(fn3); print_chunks(view3, ""); std::string_view v4 = "\u007a\u00df\u6c34\u{1f34c}"; // "zß水🍌" auto fn4 = [](auto, auto ß) { return 128 == ((128 + 64) & ß); }; auto view4 = v4 | std::views::chunk_by(fn4); print_chunks(view4, ""); }
출력:
[1, 2, 3] [1, 2, 3] [3] [3] [1, 2, 3] [1, 2, 3, 4] [4, 0, 2, 3] [3] [3, 2, 1] [_] [_] [cpp] [_] [lib] [_] [ranges] [_] [chunk] [_] [by] [z] [ß] [水] [🍌]
참조문헌
- C++23 표준 (ISO/IEC 14882:2024):
-
- 26.7.30 청크 바이 뷰 [range.chunk.by]
참고 항목
|
(C++23)
|
다른
view
의 요소들로 구성된
N
크기의 겹치지 않는 연속적인 청크들로 이루어진
view
들의 범위
(클래스 템플릿) (범위 어댑터 객체) |
|
(C++23)
|
M
번째
요소가 다른
view
의
M
번째
부터 (M + N - 1)
번째
요소들을 포함하는
view
인
view
(클래스 템플릿) (범위 어댑터 객체) |
다른
view
의 요소들로 구성된,
한 번에 N개 요소씩 건너뛰며 진행하는
view
(클래스 템플릿) (범위 어댑터 객체) |