名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <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 /* unspecified */ lazy_split = /* unspecified */;

}
(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 /* range adaptor closure */ 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_viewview と区切り文字を受け取り、view を区切り文字でサブレンジに分割します。

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

  • ビューは input_range であり、区切り文字は単一要素です (single_view でラップされています)。
  • ビューは forward_range であり、区切り文字は要素の view です。
2) RangeAdaptorObject。式 views::lazy_split(e, f)式-等価 であり、lazy_split_view(e, f) と同じです。
3) 説明専用のコンセプト /*tiny-range*/<Pattern> は、Patternsized_range を満たし、Pattern::size() が定数式であり、テンプレート非型引数として適切で、Pattern::size() の値が 1 以下である場合に満たされます。特に、empty_viewsingle_view はこのコンセプトを満たします。

lazy_split_view は、基盤となる view V がそれぞれのコンセプトを満たす場合、forward_range および input_range のコンセプトをモデル化し、Vforward_rangecommon_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)
(Vforward_range を満たさない場合にのみ存在します)
begin() への呼び出しの結果をキャッシュするオブジェクト
(説明用のメンバオブジェクト*)

[編集] メンバー関数

lazy_split_view を構築します
(public メンバ関数) [編集]
基になる(適応された)ビューのコピーを返す
(public member function) [編集]
先頭へのイテレータを返す
(public メンバ関数) [編集]
終端へのイテレータまたはセンチネルを返す
(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 メンバ関数) [編集]

[編集] ネストされたクラス

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

[編集] 推論ガイド

[編集] 注釈

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

[編集]

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>
 
auto print = [](auto const& view)
{
    // `view` is of 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を区切り文字で分割して得られる部分rangeに対する view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
rangeviewをフラット化して得られるシーケンスからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)