名前空間
変種
操作

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

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

}
(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 /* range adaptor closure */ split( Pattern&& pattern );
(C++20以降)
1) split_viewview と区切り文字を受け取り、view を区切り文字でサブレインジに分割します。
2) RangeAdaptorObject です。views::split(e, p) という式は、適切な部分式 e および p に対して 式として等価です。

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_rangerandom_access_rangebidirectional_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アダプタオブジェクト)[編集]
rangeviewをフラット化して得られるシーケンスからなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)