Namespaces
Variants

std::ranges:: views:: chunk_by, std::ranges:: chunk_by_view

From cppreference.net
Ranges library
Range adaptors
定義ヘッダ <ranges>
template < ranges:: forward_range V, std:: indirect_binary_predicate < iterator_t < V > ,

ranges:: iterator_t < V >> Pred >
requires ranges:: view < V > && std:: is_object_v < Pred >
class chunk_by_view

: public ranges:: view_interface < chunk_by_view < V, Pred >>
(1) (C++23以降)
namespace views {

inline constexpr /* 未規定 */ chunk_by = /* 未規定 */ ;

}
(2) (C++23以降)
呼び出しシグネチャ
template < ranges:: viewable_range R, class Pred >

requires /* 下記参照 */

constexpr ranges:: view auto chunk_by ( R && r, Pred && pred ) ;
(C++23以降)
template < class Pred >
constexpr /*range adaptor closure*/ chunk_by ( Pred && pred ) ;
(C++23以降)
1) chunk_by_view は、 view と呼び出し可能オブジェクト pred (二項述語)を受け取り、 view の部分範囲(チャンク)からなる view を生成する範囲アダプタです。これは、隣接する要素の各ペアに対して pred false を返す場合に、基盤となるビューを分割することによって行われます。そのような各ペアの最初の要素は前のチャンクに属し、2番目の要素は次のチャンクに属します。
2) 名前 views :: chunk_by RangeAdaptorObject を表す。部分式 e および f が与えられたとき、式 views :: chunk_by ( e, f ) 式等価 である chunk_by_view ( e, f ) に。

chunk_by_view は常に forward_range をモデルし、また、適応された view 型が対応するコンセプトをモデルする場合、 bidirectional_range および/または common_range をモデルします。 chunk_by_view borrowed_range sized_range をモデルすることはありません。

目次

データメンバ

メンバー 定義
V base_ 基となる view
( 説明専用メンバーオブジェクト* )
movable-box <Pred> pred_ base_ の要素を分割するために使用される述語をラップするオブジェクト
( 説明専用メンバーオブジェクト* )
non-propagating-cache <iterator> begin_ 最初の要素へのイテレータをキャッシュするオブジェクト
( 説明専用メンバーオブジェクト* )

メンバー関数

chunk_by_view を構築する
(公開メンバ関数)
基盤となる(適応された)ビューのコピーを返す
(公開メンバ関数)
格納された述語への参照を返す
(公開メンバ関数)
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータまたは番兵を返す
(公開メンバ関数)
次の部分範囲の先頭を指すイテレータを返す
( 説明専用メンバ関数* )
前の部分範囲の先頭を指すイテレータを返す
( 説明専用メンバ関数* )
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> の公開メンバ関数)

推論ガイド

ネストされたクラス

イテレータ型
( 説明専用メンバクラステンプレート* )

注記

range コンセプトが要求する償却定数時間計算量を提供するために、 begin() の結果は chunk_by_view オブジェクト内にキャッシュされます。基となる範囲が最初の begin() 呼び出し後に変更された場合、その後の chunk_by_view オブジェクトの使用は直感的でない動作を示す可能性があります。

機能テスト マクロ 標準 機能
__cpp_lib_ranges_chunk_by 202202L (C++23) std::ranges::chunk_by_view

#include <functional>
#include <iostream>
#include <ranges>
#include <string_view>
void print_chunks(auto view, std::string_view separator = ", ")
{
    for (auto const subrange : view)
    {
        std::cout << '[';
        for (std::string_view prefix; auto const& elem : subrange)
            std::cout << prefix << elem, prefix = separator;
        std::cout << "] ";
    }
    std::cout << '\n';
}
int main()
{
    std::initializer_list v1 = {1, 2, 3, 1, 2, 3, 3, 3, 1, 2, 3};
    auto fn1 = std::ranges::less{};
    auto view1 = v1 | std::views::chunk_by(fn1);
    print_chunks(view1);
    std::initializer_list v2 = {1, 2, 3, 4, 4, 0, 2, 3, 3, 3, 2, 1};
    auto fn2 = std::ranges::not_equal_to{};
    auto view2 = v2 | std::views::chunk_by(fn2);
    print_chunks(view2);
    std::string_view v3 = "__cpp_lib_ranges_chunk_by";
    auto fn3 = [](auto x, auto y) { return not(x == '_' or y == '_'); };
    auto view3 = v3 | std::views::chunk_by(fn3);
    print_chunks(view3, "");
    std::string_view v4 = "\u007a\u00df\u6c34\u{1f34c}"; // "zß水🍌"
    auto fn4 = [](auto, auto ß) { return 128 == ((128 + 64) & ß); };
    auto view4 = v4 | std::views::chunk_by(fn4);
    print_chunks(view4, "");
}

出力:

[1, 2, 3] [1, 2, 3] [3] [3] [1, 2, 3] 
[1, 2, 3, 4] [4, 0, 2, 3] [3] [3, 2, 1] 
[_] [_] [cpp] [_] [lib] [_] [ranges] [_] [chunk] [_] [by]
[z] [ß] [水] [🍌]

参考文献

  • C++23標準 (ISO/IEC 14882:2024):
  • 26.7.30 チャンク・バイ・ビュー [range.chunk.by]

関連項目

他の view の要素を N サイズの非重複連続チャンクとした view の範囲
(クラステンプレート) (レンジアダプタオブジェクト)
他の view のM 番目 から(M + N - 1) 番目 の要素を表す view をM 番目 の要素とする view
(クラステンプレート) (レンジアダプタオブジェクト)
他の view の要素からなり、一度にN要素進む view
(クラステンプレート) (レンジアダプタオブジェクト)