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 /*range adaptor closure*/ chunk ( DifferenceType && n ) ;
(C++23以降)
ヘルパーテンプレート
template < class I >
constexpr I /*div-ceil*/ ( I num, I denom ) ;
(4) ( 説明専用* )

chunk_view は、 view と数値 n を受け取り、元のviewの範囲から( チャンク と呼ばれる)viewの範囲を生成します。各 チャンク は、最後のチャンクを除いて、サイズ n を持ちます。これらの チャンク は、元のviewの要素に対して、順序を保ち、重複せず、連続した部分範囲を表します。

元のビューのサイズを s とします。 s n の倍数でない場合、最後に生成されるビューのサイズは正確に s % n (剰余)となります。それ以外の場合、最後のものを含む各 チャンク のサイズは 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 を構築する
(公開メンバ関数)
基となる(アダプトされた)ビューのコピーを返す
(公開メンバ関数)
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータまたはセンチネルを返す
(公開メンバ関数)
要素数を返す(基となる(アダプトされた)範囲が sized_range を満たす場合にのみ提供)
(公開メンバ関数)
結果の approximately_sized_range の近似サイズを返す
(公開メンバ関数)
std::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 はその value_type に対して views::take に委譲します。

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]

関連項目

隣接する要素のペア間で、指定された述語が false を返す場合に view を部分範囲に分割する
(クラステンプレート) (range adaptor object)
適応された view の隣接する要素への参照のタプルから構成される view
(クラステンプレート) (range adaptor object)
M th 要素が別の view のM th から(M + N - 1) th 要素を表す view
(クラステンプレート) (range adaptor object)