Namespaces
Variants

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

cppreference.net에서
 
 
Ranges 라이브러리
범위 어댑터
 
std::ranges::chunk_view
멤버 함수
를 위한 클래스 input_range
추론 가이드
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 /* unspecified */ chunk = /* unspecified */;
}
(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 /*range adaptor closure*/ 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 (나머지)이다. 그렇지 않으면 각 청크 의 크기(마지막 포함)는 n이다.

생성된 뷰의 크기는 /*div-ceil*/(s)이다.

만약 n가 0보다 크지 않으면 동작은 정의되지 않는다.

1) 기본 뷰 V가 input_range만 모델링하는 경우를 지원하는 구현.
2) 기본 뷰 V가 forward_range 이상을 모델링하는 경우를 위한 부분 특수화. 모델 common_range 기본 뷰 V가 forward_range, common_range, 그리고 sized_range 또는 bidirectional_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)
에서 상속됨 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>의 공개 멤버 함수)
는 파생된 뷰에서 n번째 요소를 반환합니다. 단, random_access_range
(std::ranges::view_interface<D>의 공개 멤버 함수)

추론 가이드

중첩 클래스

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
(클래스 템플릿) (범위 어댑터 객체)