std::ranges::views::chunk_by, std::ranges::chunk_by_view
cppreference.net에서
| 헤더에 정의됨 <ranges>
|
||
template< ranges::forward_range V, std::indirect_binary_predicate<iterator_t<V>,
ranges::iterator_t<V>> Pred >
requires ranges::view<V> && std::is_object_v<Pred>
class chunk_by_view
: public ranges::view_interface<chunk_by_view<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 */
constexpr ranges::view auto chunk_by( R&& r, Pred&& pred );
|
(C++23부터) | |
template< class Pred >
constexpr /*range adaptor closure*/ chunk_by( Pred&& pred );
|
(C++23부터) | |
1)
chunk_by_view는 view와 호출 가능 객체 pred (이항 조건자)를 받아, view 하위 범위(청크)를 생성하며, 기본 뷰를 pred이 false을 반환하는 인접한 요소 쌍 사이에서 분할합니다. 각 쌍의 첫 번째 요소는 이전 청크에 속하고, 두 번째 요소는 다음 청크에 속합니다.2) 이름
views::chunk_by은(는) RangeAdaptorObject를 나타냅니다. 하위 표현식 e과 f가 주어지면, 표현식 views::chunk_by(e, f)은(는) expression-equivalent to chunk_by_view(e, f)입니다.chunk_by_view 항상 forward_range를 모델링하며, bidirectional_range 및/또는 common_range를 모델링합니다. (적응된 view 유형이 해당 개념을 모델링하는 경우에 한함.)
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* ) |
|
다음으로부터 상속됨 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>)
| |
추론 가이드
중첩 클래스
|
반복자 타입
( 설명 전용 멤버 클래스 템플릿* ) |
참고 사항
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
(클래스 템플릿) (범위 어댑터 객체) |