Namespaces
Variants

std::ranges:: views:: split, std::ranges:: split_view

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
template < ranges:: forward_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 >
class split_view

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

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

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

requires /* 下記参照 */

constexpr ranges:: view auto split ( R && r, Pattern && pattern ) ;
(C++20以降)
template < class Pattern >
constexpr /* レンジアダプタクロージャ */ split ( Pattern && pattern ) ;
(C++20以降)
1) split_view view とデリミタを受け取り、 view をデリミタで部分範囲に分割します。
2) RangeAdaptorObject 。式 views :: split ( e, p ) は、任意の適切な部分式 e および p に対して 式等価 である split_view ( e, p ) である。

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)
range s view を平坦化して得られるシーケンスからなる view
(クラステンプレート) (range adaptor object)