名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
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 /* 未指定 */ 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_viewview と数値 n を受け取り、元のビューのビュー (チャンク) の範囲を生成します。最後のものを除いて、各チャンクのサイズは n です。これらのチャンクは、元のビューの要素の順序で、重複しない連続したサブ範囲です。

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

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

もし n0 より大きくない場合、動作は未定義です。

1) input_range のみをモデル化する基底ビュー V をサポートする実装。
2) forward_range またはそれ以上のものをモデル化する基底ビュー V をサポートする部分特殊化。forward_rangecommon_range、および sized_range または非 bidirectional_range のいずれかである場合、基底ビュー Vcommon_range をモデル化します。
3) 名前 views::chunkRangeAdaptorObject を表します。サブ式 en が与えられた場合、式 views::chunk(e, n)chunk_view(e, n)式的に同等です。
4) numdenom で割った商より小さくない最小の整数値を計算します。以下と同等です。
I r = num / denom;
if (num % denom)
    ++r;
return r;

目次

[編集] データメンバー

メンバ 説明
V base_ (private) 基盤となるビュー
(説明用のメンバオブジェクト*)
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 メンバ関数) [編集]
基になる(適応された)ビューのコピーを返す
(public member function) [編集]
先頭へのイテレータを返す
(public メンバ関数) [編集]
終端へのイテレータまたはセンチネルを返す
(public メンバ関数) [編集]
基底(アダプトされた)レンジが sized_range を満たす場合にのみ、要素数を返す
(public メンバ関数) [編集]
std::ranges::view_interface から継承
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが bidirectional_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

[編集] 推論ガイド

[編集] ネストされたクラス

Vinput_range をモデル化するときの出力 ("チャンクごと") イテレータ型 (1)
(説明専用メンバクラス*)
Vinput_range をモデル化するときの内部 ("要素ごと") イテレータ型 (1)
(説明専用メンバクラス*)
(C++23)
Vforward_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 のこの特殊化により、基底ビュー Vforward_rangeborrowed_range の両方を満たす場合に、chunk_viewborrowed_range を満たします。

[編集] 注釈

Vinput_range をモデル化する場合 (1)chunk_view のイテレータには、それ自体が入力ビューである専用の型 outer_iterator::value_type があります。

Vforward_range またはそれ以上をモデル化する場合 (2)chunk_view はその value_type について views::take に委譲します。

Vbidirectional_range またはそれ以上の範囲をモデル化する場合 (2)、最後のチャンクのサイズを正しく計算するため (末尾 イテレータ から)、基底の範囲型 Vsized_range である必要があります。

機能テストマクロ 規格 機能
__cpp_lib_ranges_chunk 202202L (C++23) std::ranges::chunk_view

[編集]

#include <algorithm>
#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 Chunk view [range.chunk]

[編集] 関連項目

与えられた述語がfalseを返す隣接要素のペアごとにviewを部分rangeに分割する
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
適合するviewの隣接する要素への参照のタプルからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
M番目の要素が別のviewのM番目から(M + N - 1)番目の要素に対するviewであるview
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)