std::ranges::views::split, std::ranges::split_view
| ヘッダ <ranges> で定義 |
||
| template< ranges::forward_range V, ranges::forward_range Pattern > requires ranges::view<V> && |
(1) | (C++20以降) |
| namespace views { inline constexpr /* unspecified */ split = /* unspecified */; |
(2) | (C++20以降) |
| 呼び出しシグネチャ |
||
| template< ranges::viewable_range R, class Pattern > requires /* 以下を参照 */ |
(C++20以降) | |
| template< class Pattern > constexpr /* range adaptor closure */ split( Pattern&& pattern ); |
(C++20以降) | |
split_view は、基になる view V がそれぞれのコンセプトをモデルしている場合、forward_range および common_range のコンセプトをモデルします。
内部の範囲 (ranges::range_reference_t<split_view>) は ranges::subrange<ranges::iterator_t<V>> であり、common_range をモデルし、ranges::iterator_t<V> が std::sized_sentinel_for<ranges::iterator_t<V>> をモデルする場合 sized_range をモデルし、V がそれぞれのコンセプトをモデルする場合 contiguous_range、random_access_range、bidirectional_range、および forward_range をモデルします。
lazy_split_view とは異なり、split_view はサブレインジの連続性を維持するため、文字列の分割に適しています。
目次 |
[編集] データメンバー
| メンバ | 説明 |
V base_ (private) |
基になる(適応された)view(説明用のメンバオブジェクト*) |
Pattern pattern_ (private) |
基になる view を分割するための区切り文字として使用されるパターンオブジェクト(説明用のメンバオブジェクト*) |
non-propagating-cache<ranges::subrange <ranges::iterator_t<V>>> cached_begin_ (private) |
begin() の最初の呼び出しの結果をキャッシュするオブジェクト(説明用のメンバオブジェクト*) |
[編集] メンバ関数
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 メンバ関数) | |
[編集] 入れ子クラス
| イテレータ型 (説明専用メンバクラス*) | |
| センチネル型 (説明専用メンバクラス*) |
[編集] 推論ガイド
[編集] ノート
P2210R2 以前は、split_view は分割に遅延メカニズムを使用していたため、基になるビューの双方向性、ランダムアクセス性、連続性を維持したり、内部範囲のイテレータ型を基になるビューのイテレータ型と同じにしたりすることはできませんでした。その結果、P2210R2 によって再設計され、遅延メカニズムは lazy_split_view に移動されました。
区切り文字の pattern は、一般的に通常の文字列リテラルであるべきではありません。なぜなら、null終端文字を区切り文字の必要な部分と見なすためです。したがって、代わりに std::string_view リテラルを使用することが推奨されます。
[編集] 例
#include <iomanip> #include <iostream> #include <ranges> #include <string_view> int main() { using std::operator""sv; constexpr auto words{"Hello^_^C++^_^20^_^!"sv}; constexpr auto delim{"^_^"sv}; for (const auto word : std::views::split(words, delim)) // with string_view's C++23 range constructor: std::cout << std::quoted(std::string_view(word)) << ' '; std::cout << '\n'; }
出力
"Hello" "C++" "20" "!"
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2210R2 | C++20 | 古い split_view は遅延が多すぎて簡単に使えなかった |
再設計された |
[編集] 関連項目
別のviewを区切り文字で分割して得られる部分rangeに対する view(クラステンプレート) (rangeアダプタオブジェクト) | |
| (C++20) |
rangeのviewをフラット化して得られるシーケンスからなる view(クラステンプレート) (rangeアダプタオブジェクト) |