Namespaces
Variants

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]

참고 항목

다른 view 의 요소들로 구성된 N 크기의 겹치지 않는 연속적인 청크들로 이루어진 view 들의 범위
(클래스 템플릿) (범위 어댑터 객체)
M 번째 요소가 다른 view 의 M 번째 부터 (M + N - 1) 번째 요소들을 포함하는 view 인 view
(클래스 템플릿) (범위 어댑터 객체)
다른 view 의 요소들로 구성된, 한 번에 N개 요소씩 건너뛰며 진행하는 view
(클래스 템플릿) (범위 어댑터 객체)