std::ranges::views::chunk, std::ranges::chunk_view
| ヘッダ <ranges> で定義 |
||
template< ranges::view V > requires ranges::input_range<V> |
(1) | (C++23から) |
template< ranges::view V > requires ranges::forward_range<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 (剰余) です。それ以外の場合、最後のチャンクを含む各チャンクのサイズは n です。
生成されるビューのサイズは /*div-ceil*/(s) です。
もし n が 0 より大きくない場合、動作は未定義です。
forward_range またはそれ以上のものをモデル化する基底ビュー V をサポートする部分特殊化。forward_range、common_range、および sized_range または非 bidirectional_range のいずれかである場合、基底ビュー V が common_range をモデル化します。I r = num / denom; if (num % denom) ++r; return r;
目次 |
[編集] データメンバー
| メンバ | 説明 |
V base_ (private) |
基盤となるビュー (説明用のメンバオブジェクト*) |
ranges::range_difference_t<V> n_ (プライベート) |
「チャンクサイズ」 (説明用のメンバオブジェクト*) |
| |
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_range と common_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す( std::ranges::view_interface<D> の public メンバ関数) | |
[編集] 推論ガイド
[編集] ネストされたクラス
| (C++23) |
V が input_range をモデル化するときの出力 ("チャンクごと") イテレータ型 (1)(説明専用メンバクラス*) |
| (C++23) |
V が input_range をモデル化するときの内部 ("要素ごと") イテレータ型 (1)(説明専用メンバクラス*) |
| (C++23) |
V が forward_range またはそれ以上をモデル化するときのイテレータ型 (2)(説明専用メンバクラステンプレート*) |
[編集] ヘルパーテンプレート
| template< class V > constexpr bool ranges::enable_borrowed_range<chunk_view<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)、最後のチャンクのサイズを正しく計算するため (末尾 イテレータ から)、基底の範囲型 V は sized_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アダプタオブジェクト) |