Namespaces
Variants

std::ranges:: views:: lazy_split, std::ranges:: lazy_split_view

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
template < ranges:: input_range V, ranges:: forward_range Pattern >

requires ranges:: view < V > &&
ranges:: view < Pattern > &&
std:: indirectly_comparable < ranges:: iterator_t < V > ,
ranges:: iterator_t < Pattern > ,
ranges:: equal_to > &&
( ranges:: forward_range < V > || /*tiny-range*/ < Pattern > )
class lazy_split_view

: public ranges:: view_interface < lazy_split_view < V, Pattern >>
(1) (C++20以降)
namespace views {

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

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

requires /* 下記参照 */

constexpr ranges:: view auto lazy_split ( R && r, Pattern && pattern ) ;
(C++20以降)
template < class Pattern >
constexpr /* レンジアダプタクロージャ */ lazy_split ( Pattern && pattern ) ;
(C++20以降)
ヘルパーコンセプト
template < class R >

concept /*tiny-range*/ =
ranges:: sized_range < R > &&
requires { /* is-statically-constexpr-sized */ < R > ; } &&

( std:: remove_reference_t < R > :: size ( ) <= 1 ) ;
(3) ( 説明専用* )
1) lazy_split_view view とデリミタを受け取り、 view をデリミタで部分範囲に分割します。

主に2つのシナリオがサポートされています:

2) A RangeAdaptorObject 。式 views :: lazy_split ( e, f ) 式等価 である lazy_split_view ( e, f ) に。
3) エクスポジション限定コンセプト /*tiny-range*/ < Pattern > は、 Pattern sized_range を満たし、 Pattern :: size ( ) が定数式でありテンプレート定数引数として適切であり、かつ Pattern :: size ( ) の値が 1 以下である場合に満たされる。特に、 empty_view single_view はこのコンセプトを満たす。

lazy_split_view は、基盤となる view V がそれぞれのコンセプトを満たす場合、 forward_range および input_range コンセプトをモデルし、 V forward_range common_range の両方を満たす場合には common_range もモデルする。

内部の範囲( ranges:: range_reference_t < lazy_split_view > )は、基盤となる view V がそれぞれのコンセプトをモデルする場合、 forward_range および input_range コンセプトをモデルします。 common_range はモデルせず、 bidirectional_range 以上の範囲を期待するアルゴリズムでは使用できません。

split_view とは異なり、 lazy_split_view はサブレンジの連続性を維持しません。

目次

データメンバ

メンバー 説明
V base_ (private) 基となる view
( 説明専用メンバーオブジェクト* )
Pattern pattern_ (private) 基となる view を分割するために区切り文字として使用されるパターン
( 説明専用メンバーオブジェクト* )
non-propagating-cache < ranges:: iterator_t < V >> current_ (private)
( V forward_range を満たさない場合にのみ存在)
begin() の呼び出し結果をキャッシュするオブジェクト
( 説明専用メンバーオブジェクト* )

メンバー関数

lazy_split_view を構築する
(public member function)
基盤となる(適応された)ビューのコピーを返す
(public member function)
先頭を指すイテレータを返す
(public member function)
終端を指すイテレータまたはセンチネルを返す
(public member function)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す( sized_range または forward_range を満たす場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)
(C++23)
範囲の先頭を指す定数イテレータを返す
( std::ranges::view_interface<D> のpublic member function)
(C++23)
範囲の定数イテレータ用センチネルを返す
( std::ranges::view_interface<D> のpublic member function)
派生ビューが空でないかどうかを返す( ranges::empty が適用可能な場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)
派生ビューの最初の要素を返す( forward_range を満たす場合のみ提供)
( std::ranges::view_interface<D> のpublic member function)

ネストされたクラス

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

推論ガイド

注記

lazy_split_view という名称は、C++20以降の欠陥報告書 P2210R2 によって導入されました。これは変更前の旧 split_view と同じ遅延評価メカニズムを持っています。

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>
auto print = [](auto const& view)
{
    // `view` は std::views::lazy_split_view::__outer_iterator::value_type 型
    for (std::cout << "{ "; const auto element : view)
        std::cout << element << ' ';
    std::cout << "} ";
};
int main()
{
    constexpr static auto source = {0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9};
    constexpr int delimiter{0};
    constexpr std::ranges::lazy_split_view outer_view{source, delimiter};
    std::cout << "splits[" << std::ranges::distance(outer_view) << "]:  ";
    for (auto const& inner_view: outer_view)
        print(inner_view);
    constexpr std::string_view hello{"Hello C++ 20 !"};
    std::cout << "\n" "substrings: ";
    std::ranges::for_each(hello | std::views::lazy_split(' '), print);
    constexpr std::string_view text{"Hello-+-C++-+-20-+-!"};
    constexpr std::string_view delim{"-+-"};
    std::cout << "\n" "substrings: ";
    std::ranges::for_each(text | std::views::lazy_split(delim), print);
}

出力:

splits[5]:  { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
substrings: { H e l l o } { C + + } { 2 0 } { ! }

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2210R2 C++20 従来の split_view は遅延評価が強すぎて使いづらかった その機能を lazy_split_view に移行

関連項目

デリミタを使用して別の view を分割して得られる部分範囲に対する view
(クラステンプレート) (range adaptor object)
range s view を平坦化して得られるシーケンスからなる view
(クラステンプレート) (range adaptor object)