std::ranges::views::lazy_split, std::ranges::lazy_split_view
ja.cppreference.net より
| ヘッダ <ranges>
|
||
template< ranges::input_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> &&
(ranges::forward_range<V> || /*tiny-range*/<Pattern>)
class lazy_split_view
: public ranges::view_interface<lazy_split_view<V, Pattern>>
|
で定義 | (C++20 以降) |
namespace views {
inline constexpr /* unspecified */ lazy_split = /* unspecified */;
}
|
(2) | (C++20 以降) |
| 呼び出しシグネチャ |
||
template< ranges::viewable_range R, class Pattern >
requires /* see below */
constexpr ranges::view auto lazy_split( R&& r, Pattern&& pattern );
|
(C++20 以降) | |
template< class Pattern >
constexpr /* range adaptor closure */ lazy_split( Pattern&& pattern );
|
(C++20 以降) | |
| ヘルパーコンセプト |
||
template< class R >
concept /*tiny-range*/ =
ranges::sized_range<R> &&
requires { /* is-statically-constexpr-sized */<R>; } &&
(std::remove_reference_t<R>::size() <= 1);
|
(3) | (説明専用*) |
1)
lazy_split_view view と区切り文字を受け取り、区切り文字で view を部分範囲に分割します。
以下の2つの主要なシナリオがサポートされています:
- ビューが input_range であり、区切り文字が単一の要素(
single_viewでラップされる)である場合。 - ビューが forward_range であり、区切り文字が要素の view である場合。
3) 説明専用のコンセプト
/*tiny-range*/<Pattern> は、Pattern が sized_range を満たし、Pattern::size() が定数式でありテンプレート非型引数として適切であり、かつ Pattern::size() の値が 1 以下である場合に満たされます。特に、empty_view と single_view はこのコンセプトを満たします。lazy_split_view は、基底の view が各コンセプトをモデル化する場合、コンセプト forward_range と input_range V をモデル化し、 が forward_rangeV と common_range の両方をモデル化する場合、common_range をモデル化します。
内部範囲 (ranges::range_reference_t<lazy_split_view>) は、基底の view が各コンセプトをモデル化する場合、コンセプト forward_range と input_range V をモデル化します。これは common_range をモデル化せず、bidirectional_range 以上を期待するアルゴリズムでは使用できません。
split_view とは異なり、lazy_split_view は部分範囲の連続性を維持しません。
データメンバ
| メンバー | 説明 |
V
base_
(private)
|
基となる
view
( 説明専用メンバーオブジェクト* ) |
Pattern
pattern_
(private)
|
基となる
view
を分割するために区切り文字として使用されるパターン
( 説明専用メンバーオブジェクト* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
current_
(private)
(
V
が
forward_range
を満たさない場合にのみ存在)
|
begin()
の呼び出し結果をキャッシュするオブジェクト
( 説明専用メンバーオブジェクト* ) |
メンバー関数
lazy_split_viewを構築する
(public member function) |
|
|
基盤となる(適応された)ビューのコピーを返す
(public member function) |
|
|
先頭を指すイテレータを返す
(public member function) |
|
|
終端を指すイテレータまたはセンチネルを返す
(public member function) |
|
ranges::view_interface | |
|
empty派生ビューが空かどうかを返します。これは、そのビューが sized_range または forward_range std::ranges::view_interface<D> を満たす場合にのみ提供されます。(
| |
cbegin |
(C++23) 範囲の先頭への定数イテレータを返します。( std::ranges::view_interface<D> のパブリックメンバ関数)
|
(C++23) |
範囲の定数イテレータに対する番兵を返します。( のパブリックメンバ関数) std::ranges::view_interface<D>
operator bool
|
| ranges::empty がそのビューに適用可能な場合にのみ提供されます。( のパブリックメンバ関数) front std::ranges::view_interface<D>派生ビューの最初の要素を返します。これは、そのビューが
| |
を満たす場合に提供されます。( のパブリックメンバ関数) std::ranges::view_interface<D>
| |
ネストされたクラス
|
イテレータ型
( 説明専用メンバクラステンプレート* ) |
|
|
内部範囲のイテレータ型
( 説明専用メンバクラステンプレート* ) |
推論ガイド
注記
lazy_split_viewという名称は、C++20以降の欠陥報告書
P2210R2
によって導入されました。これは変更前の旧
split_view
と同じ遅延評価メカニズムを持っています。
例
このコードを実行
#include <algorithm> #include <iostream> #include <ranges> #include <string_view> auto print = [](auto const& view) { // `view` は std::views::lazy_split_view::__outer_iterator::value_type 型 for (std::cout << "{ "; const auto element : view) std::cout << element << ' '; std::cout << "} "; }; int main() { constexpr static auto source = {0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9}; constexpr int delimiter{0}; constexpr std::ranges::lazy_split_view outer_view{source, delimiter}; std::cout << "splits[" << std::ranges::distance(outer_view) << "]: "; for (auto const& inner_view: outer_view) print(inner_view); constexpr std::string_view hello{"Hello C++ 20 !"}; std::cout << "\n" "substrings: "; std::ranges::for_each(hello | std::views::lazy_split(' '), print); constexpr std::string_view text{"Hello-+-C++-+-20-+-!"}; constexpr std::string_view delim{"-+-"}; std::cout << "\n" "substrings: "; std::ranges::for_each(text | std::views::lazy_split(delim), print); }
出力:
splits[5]: { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P2210R2 | C++20 |
従来の
split_view
は遅延評価が強すぎて使いづらかった
|
その機能を
lazy_split_view
に移行
|
関連項目
|
(C++20)
|
デリミタを使用して別の
view
を分割して得られる部分範囲に対する
view
(クラステンプレート) (range adaptor object) |
|
(C++20)
|
range
s
の
view
を平坦化して得られるシーケンスからなる
view
(クラステンプレート) (range adaptor object) |