次の方法で共有


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

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

split_viewlazy_split_viewの主な違いは次のとおりです。

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

lazy_split_viewが "遅延" になるのは、次の区切り記号を先読みしないということです。 つまり、 input_range をサポートできますが、 split_view には少なくとも forward_rangeが必要です。 これは、 input_range がシングルパスであるのに対し、 forward_range ではマルチパスの反復が可能であるためです。

const範囲を分割する必要がない限り、split_viewの方が効率的です。 パフォーマンスに関しては、 split_view の方が効率的です。

lazy_split_viewは、split_viewよりも効率的な反復子のインクリメントと比較を行いませんが、O(1) のままです。 区切り記号間の距離が CPU キャッシュに収まるのに十分に小さい場合、 split_view のパフォーマンスが向上します。この場合、区切り記号の先読みでは、効果的に次のサブ範囲が事前にキャッシュされます。

構文

template<input_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
    indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> &&
    (forward_range<V> || tiny_range<Pattern>)
class lazy_split_view : public view_interface<lazy_split_view<V, Pattern>>

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

Pattern
区切り記号シーケンスを指定するビューの型。
(forward_range<V> || tiny-range <Pattern>)要件は、基になる範囲がforward_rangeされていない場合、区切り記号がtiny_rangeである必要があることを意味します。 tiny_rangeは、静的エクステントのサイズが 0 または 1 の範囲です。 tiny_range<T> には sized_range<T>が必要であり、 T::size() は 1 以下の定数式である必要があります。

V
基になるビューの型。

特性

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

Range adaptor: lazy_splitUnderlying range: は、基になる範囲 input_rangeView 反復子カテゴリ:基になる範囲と同じrange_reference_t<V>Sized: 基になる範囲がforward_rangecommonの両方である場合は、Common range: はいを満たす必要があります。 Borrowed range: no Is const-iterable: 基になる範囲が forward_range を満たし、 const-iterable である場合のみ

メンバー

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

要件

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

名前空間: std::ranges

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

コンストラクター

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

1) lazy_split_view() = default;
2) constexpr lazy_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 lazy_split_view(R&& rg, range_value_t<R> e);

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

Pattern
区切り記号の型。

R
範囲の型。

V
基になるビューの型。

パラメーター

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

base
基になるビュー。

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

rg
分割する範囲。

戻り値

1 つ以上のsubrangeを含むlazy_split_view インスタンス。

解説

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

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

例: lazy_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
    {
        // outputs 1 1 4 5 6
        for (auto& i : splitRange)
        {
            std::cout << i << " ";
        }
    }
}
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();
constexpr auto begin() const requires forward_range<V> && forward_range<const V>

パラメーター

ありません。

戻り値

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

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

end

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

1) constexpr auto end() const;
2) constexpr auto end() requires forward_range<V> && common_range<V>;

パラメーター

ありません。

戻り値

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

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

解説

2) forward_range<V> 要件は、ビュー V が少なくとも前方反復子を持っていることを意味します。 範囲反復子の詳細については、「 View クラスの特性を参照してください。 common_range<V>要件は、ビューVの反復子とセンチネルの型が同じであることを意味します。

関連項目

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