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
/* 未規定 */
split
=
/* 未規定 */
;
|
(2) | (C++20以降) |
|
呼び出しシグネチャ
|
||
|
template
<
ranges::
viewable_range
R,
class
Pattern
>
requires
/* 下記参照 */
|
(C++20以降) | |
|
template
<
class
Pattern
>
constexpr /* レンジアダプタクロージャ */ split ( Pattern && pattern ) ; |
(C++20以降) | |
split_view
は、
forward_range
および
common_range
コンセプトをモデル化します。これは、基盤となる
view
V
がそれぞれのコンセプトをモデル化している場合に限ります。
内部レンジ(
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
を構築する
(公開メンバ関数) |
|
|
基盤となる(アダプトされた)ビューのコピーを返す
(公開メンバ関数) |
|
|
先頭を指すイテレータを返す
(公開メンバ関数) |
|
|
終端を指すイテレータまたは番兵を返す
(公開メンバ関数) |
|
|
パターンの次の出現を検索する
( 説明専用メンバ関数* ) |
|
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>
の公開メンバ関数)
|
|
ネストされたクラス
|
イテレータ型
( 説明専用メンバクラス* ) |
|
|
センチネル型
( 説明専用メンバクラス* ) |
推論ガイド
注記
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)) // string_viewのC++23 rangeコンストラクタを使用: std::cout << std::quoted(std::string_view(word)) << ' '; std::cout << '\n'; }
出力:
"Hello" "C++" "20" "!"
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P2210R2 | C++20 |
従来の
split_view
は遅延評価が強すぎて実用的ではなかった
|
再設計された |
関連項目
別の
view
をデリミタを使用して分割して得られる部分範囲に対する
view
(クラステンプレート) (range adaptor object) |
|
|
(C++20)
|
range
s
の
view
を平坦化して得られるシーケンスからなる
view
(クラステンプレート) (range adaptor object) |