std::ranges::views::lazy_split, std::ranges::lazy_split_view
| ヘッダ <ranges> で定義 |
||
| template< ranges::input_range V, ranges::forward_range Pattern > requires ranges::view<V> && |
(1) | (C++20以降) |
| namespace views { inline constexpr /* unspecified */ lazy_split = /* unspecified */; |
(2) | (C++20以降) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R, class Pattern > requires /* 以下を参照 */ |
(C++20以降) | |
| template< class Pattern > constexpr /* range adaptor closure */ lazy_split( Pattern&& pattern ); |
(C++20以降) | |
| ヘルパーコンセプト |
||
| template< class R > concept /*tiny-range*/ = |
(3) | (説明用*) |
lazy_split_view は view と区切り文字を受け取り、view を区切り文字でサブレンジに分割します。2つの主要なシナリオがサポートされています
- ビューは
input_rangeであり、区切り文字は単一要素です (single_viewでラップされています)。 - ビューは
forward_rangeであり、区切り文字は要素のviewです。
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 メンバ関数) | |
| 基になる(適応された)ビューのコピーを返す (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アダプタオブジェクト) | |
| (C++20) |
rangeのviewをフラット化して得られるシーケンスからなる view(クラステンプレート) (rangeアダプタオブジェクト) |