次の方法で共有


split_view クラス (C++ 標準ライブラリ)

区切り記号に基づいてビューをサブ範囲に分割します。 区切り記号には、1 つの要素または要素のビューを指定できます。 区切り記号は、結果の split_viewの一部ではありません。

関連ビューは、 lazy_split_view クラスです。 split_viewlazy_split_viewの主な違いは次のとおりです。

表示 const範囲を分割できます 範囲の種類
split_view いいえ forward_range以上をサポートします。
lazy_split_view はい input_range以上をサポートします。

const範囲を分割する必要がない限り、より効率的であるため、split_viewを優先します。

構文

template<forward_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
    indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>
class split_view : public view_interface<split_view<V, Pattern>>;

テンプレート パラメーター

Pattern
区切り記号シーケンスを指定するビューの型。

V
基になるビューの型。

特性の表示

以下の項目の説明については、 View クラスの特性を参照してください。

特徴 説明
範囲アダプター views::split
基になる範囲 基になる範囲と同じ
要素の種類 range_reference_t<V>
反復子カテゴリの表示 満たす forward_range
サイズ いいえ
const対応 いいえ
共通範囲 基になる範囲が満たされる場合のみ common_range
借用範囲 いいえ

メンバー

メンバー関数 説明
コンストラクター ビューを構築します。
baseC++20 基になる範囲を取得します。
beginC++20 最初の要素を指す反復子を取得します。
endC++20 ビューの最後にあるセンチネルを取得します。
継承の対象 view_interface 説明
emptyC++20 ビューが空かどうかをテストします。
frontC++20 最初の要素を取得します。
operator boolC++20 ビューが空でないかどうかをテストします。

要件

Header: <ranges> (C++20 以降)

名前空間: std::ranges

コンパイラ オプション: /std:c++20 以降が必要です。

コンストラクター

のインスタンスを構築する split_view

1) split_view() requires default_initializable<V> && default_initializable<Pattern> = default;
2) constexpr split_view(V base, Pattern pattern);
3) template<input_range R> requires constructible_from<V, views::all_t<R>> &&
     constructible_from<Pattern, single_view<range_value_t<R>>>
     constexpr split_view(R&& rg, range_value_t<R> e);

パラメーター

e
ビューを分割する場所を識別する 1 つの要素。 要素は、結果のビューの一部ではありません。

base
基になるビュー。

pattern
ビューを分割する場所を識別する要素のビュー。 要素のビューは、結果のビューの一部ではありません。

rg
分割する範囲。

テンプレート パラメーターの型の詳細については、「 Template パラメーターを参照してください。

戻り値

1 つ以上のサブ範囲を含む split_view インスタンス。

解説

split_viewを作成する最善の方法は、views::split範囲アダプターを使用することです。 範囲アダプターは、ビュー クラスを作成するための目的の方法です。 ビューの種類は、独自のカスタム ビューの種類を作成する場合にのみ公開されます。

1) 既定で構築された split_view を作成します。 基になるビューと pattern は、既定で構築されます。 base() は、 V()のコピーを返します。
2) 区切り記号のシーケンスを使用してビューを分割して、 split_view を作成します。
3) 1 つの区切り記号を使用してビューを分割して、 split_view を作成します。

split_view

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> rg{ 1, 2, 3, 1, 2, 3, 4, 5, 6 };

    // pipe syntax using range adaptor
    for (const auto& subrange : rg | std::views::split(3))
    {
        // outputs
        // 1 2
        // 1 2
        // 4 5 6
        for (const auto& elem : subrange)
        {
            std::cout << elem << ' ';
        }
        std::cout << '\n';
    }
    
    int delimiters[] = {2, 3};
    for (auto splitRange : std::views::split(rg, delimiters)) // ctor syntax
    {
        for (auto& i : splitRange)
        {
            std::cout << i << " "; // 1 1 4 5 6
        }
    }
}
1 2
1 2
4 5 6
1 1 4 5 6

base

基になるビューのコピーを取得します。

// Uses a copy constructor to return the underlying view
1) constexpr V base() const & requires std::copy_constructible<V>;

// Uses a move constructor to return the underlying view
2) constexpr V base() &&;

パラメーター

ありません。

返品

基になるビュー。

begin

ビューの最初の要素を指す反復子を取得します。

constexpr auto begin();

パラメーター

ありません。

戻り値

ビューの最初の要素を指す反復子。

要素 10、20、30 を持つベクトルの図。最初の要素には 10 が含まれており、begin() というラベルが付いています。最後の要素には 30 が含まれており、

end

ビューの最後にあるセンチネルを取得します。

constexpr auto end();

パラメーター

ありません。

戻り値

ビューの最後の要素に続く Sentinel:

要素 10、20、30 を持つベクトルの図。最初の要素には 10 が含まれており、begin() というラベルが付いています。最後の要素には 30 が含まれており、

関連項目

<ranges>
split_view 範囲アダプター
lazy_split_view クラス
クラスの表示