Namespaces
Variants

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

ja.cppreference.net より
 
 
範囲ライブラリ
範囲アダプタ
 
std::ranges::chunk_view
メンバ関数
input_range用のクラス
推論ガイド
外部イテレータ
outer-iterator::value_type
内部イテレータ
 
ヘッダ <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_viewview と数値 n を受け取り、元のビューのビュー(チャンク )の範囲を生成します。各 チャンク  は、最後のものを除き、サイズ n を持ちます。これらの チャンク は、元のビューの要素の、重複しない連続した部分範囲であり、順序付けられています。

元のビューのサイズを s とします。s が n の倍数でない場合、生成された最後のビューのサイズは正確に s % n(余り)になります。それ以外の場合、チャンク のサイズは、最後のものを含め、すべて n です。

生成されるビューのサイズは /*div-ceil*/(s) です。

n が 0 より大きくない場合、動作は未定義です。

1)Vinput_range のみをモデル化する 実装です。
2)Vforward_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を構築する
(公開メンバ関数)
基となる(アダプトされた)ビューのコピーを返す
(公開メンバ関数)
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータまたはセンチネルを返す
(公開メンバ関数)
要素数を返す(基となる(アダプトされた)範囲が sized_range を満たす場合にのみ提供)
(公開メンバ関数)
結果の approximately_sized_range の近似サイズを返す
(公開メンバ関数)
ranges::view_interface
empty派生ビューが空かどうかを返します。ただし、そのビューが sized_range または
forward_rangestd::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)