Namespaces
Variants

std::ranges:: views:: chunk_by, std::ranges:: chunk_by_view

From cppreference.net
Ranges library
Range adaptors
헤더 파일에 정의됨 <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 (이항 조건자)를 취하는 범위 어댑터로, 기본 뷰를 인접한 요소 쌍 사이에서 pred false 를 반환하는 각 지점에서 분할하여 하위 범위(청크)들의 view 를 생성합니다. 이러한 각 쌍의 첫 번째 요소는 이전 청크에 속하고, 두 번째 요소는 다음 청크에 속합니다.
2) 이름 views :: chunk_by RangeAdaptorObject 를 나타냅니다. 부분 표현식 e f 가 주어졌을 때, 표현식 views :: chunk_by ( e, f ) 표현식 동등 합니다 chunk_by_view ( e, f ) 에.

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]

참고 항목

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