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 /*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 より大きくない場合、動作は未定義です。
V
が
forward_range
以上の要件を満たす場合をサポートする部分特殊化。
基盤となるビュー
V
が
forward_range
かつ
common_range
であり、かつ
sized_range
であるか
bidirectional_range
でない場合に
common_range
をモデル化する。
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
の近似サイズを返す
(公開メンバ関数) |
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>
の公開メンバ関数)
|
|
推論ガイド
ネストされたクラス
|
(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) |