Namespaces
Variants

std::ranges:: views:: chunk, std::ranges:: chunk_view

From cppreference.net
Ranges library
Range adaptors
std::ranges::chunk_view
Member functions
Classes for input_range s
Deduction guides
outer-iterator
outer-iterator ::value_type
inner-iterator
헤더 파일에 정의됨 <ranges>
template < ranges:: view V >

requires ranges:: input_range < V >
class chunk_view

: public ranges:: view_interface < chunk_view < V >>
(1) (C++23부터)
template < ranges:: view V >

requires ranges:: forward_range < V >
class chunk_view < V >

: public ranges:: view_interface < chunk_view < 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 보다 크지 않으면 동작은 정의되지 않습니다.

1) 기본 뷰 V input_range 만 모델링하는 구현입니다.
2) 기본 뷰 V forward_range 이상의 개념을 모델링하는 부분 특수화. 기본 뷰 V forward_range 이고, common_range 이며, sized_range 이거나 bidirectional_range 가 아닌 경우 common_range 을 모델링합니다.
3) 이름 views :: chunk RangeAdaptorObject 를 나타냅니다. 부분 표현식 e n 이 주어졌을 때, 표현식 views :: chunk ( e, n ) 표현식 동등 하게 chunk_view ( e, n ) 입니다.
4) num denom 으로 나눈 몫보다 작지 않은 가장 작은 정수 값을 계산합니다. 다음 코드와 동일합니다:
I r = num / denom;
if (num % denom)
    ++r;
return r;

목차

데이터 멤버

멤버 설명
V base_ 기반 뷰
( 설명 전용 멤버 객체* )
ranges:: range_difference_t < V > n_ "청크" 크기
( 설명 전용 멤버 객체* )
V 가 정확히 input_range 를 모델링하는 경우 ( 1 )
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)
결과 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)

추론 가이드

중첩 클래스

V input_range 를 모델링할 때의 출력("청크 단위") 반복자 타입 ( 1 )
( 설명 전용 멤버 클래스* )
V input_range 를 모델링할 때의 내부("요소 단위") 반복자 타입 ( 1 )
( 설명 전용 멤버 클래스* )
(C++23)
V forward_range 를 모델링할 때의 반복자 타입 ( 2 )
( 설명 전용 멤버 클래스 템플릿* )

헬퍼 템플릿

template < class V >

constexpr bool ranges:: enable_borrowed_range < chunk_view < V >> =

ranges:: forward_range < V > && ranges:: enable_borrowed_range < 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
(클래스 템플릿) (범위 어댑터 객체)
M 번째 요소가 다른 view 의 M 번째 부터 (M + N - 1) 번째 요소에 대한 view view
(클래스 템플릿) (범위 어댑터 객체)