std::ranges::views::chunk, std::ranges::chunk_view
| ヘッダ <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 より大きくない場合、動作は未定義です。
Vforward_range 以上をモデル化する
の部分特殊化です。common_range をモデル化するのは、元のビュー V が forward_range、common_range であり、かつ sized_range または非 bidirectional_range のいずれかである場合です。views::chunk は RangeAdaptorObject を表します。部分式 e と n が与えられたとき、式 views::chunk(e, n) は 式と等価であり、chunk_view(e, n) と等価です。num を denom で割った商以上の最小の整数値を計算します。以下と等価です。
I r = num / denom;
if (num % denom)
++r;
return r;
データメンバ
| メンバー | 説明 |
V
base_
|
基となるビュー
( 説明専用メンバーオブジェクト* ) |
ranges::
range_difference_t
<
V
>
n_
|
チャンクサイズ
( 説明専用メンバーオブジェクト* ) |
|
|
ranges::
range_difference_t
<
V
>
remainder_
(条件付きで存在) |
現在の「チャンク」に残っている要素の数
( 説明専用メンバオブジェクト* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
current_
(条件付きで存在) |
現在の基盤イテレータをキャッシュするオブジェクト
( 説明専用メンバオブジェクト* ) |
メンバー関数
chunk_viewを構築する
(公開メンバ関数) |
|
|
基となる(アダプトされた)ビューのコピーを返す
(公開メンバ関数) |
|
|
先頭を指すイテレータを返す
(公開メンバ関数) |
|
|
終端を指すイテレータまたはセンチネルを返す
(公開メンバ関数) |
|
要素数を返す(基となる(アダプトされた)範囲が
sized_range
を満たす場合にのみ提供)
(公開メンバ関数) |
|
|
(C++26)
|
結果の
approximately_sized_range
の近似サイズを返す
(公開メンバ関数) |
ranges::view_interface | |
| empty派生ビューが空かどうかを返します。ただし、そのビューが sized_range または forward_range std::ranges::view_interface<D> を満たす場合に限ります(
| |
cbegin |
(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> のパブリックメンバ関数)
| |
推論ガイド
ネストされたクラス
|
(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
)
、最後のチャンクのサイズを正しく計算する(終端
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) |
|
|
(C++23)
|
M
th
要素が別の
view
のM
th
から(M + N - 1)
th
要素を表す
view
(クラステンプレート) (range adaptor object) |