std::ranges:: views:: lazy_split, std::ranges:: lazy_split_view
|
ヘッダーで定義
<ranges>
|
||
|
template
<
ranges::
input_range
V,
ranges::
forward_range
Pattern
>
requires
ranges::
view
<
V
>
&&
|
(1) | (C++20以降) |
|
namespace
views
{
inline
constexpr
/* 未規定 */
lazy_split
=
/* 未規定 */
;
|
(2) | (C++20以降) |
|
呼び出しシグネチャ
|
||
|
template
<
ranges::
viewable_range
R,
class
Pattern
>
requires
/* 下記参照 */
|
(C++20以降) | |
|
template
<
class
Pattern
>
constexpr /* レンジアダプタクロージャ */ lazy_split ( Pattern && pattern ) ; |
(C++20以降) | |
|
ヘルパーコンセプト
|
||
|
template
<
class
R
>
concept
/*tiny-range*/
=
|
(3) | ( 説明専用* ) |
lazy_split_view
は
view
とデリミタを受け取り、
view
をデリミタで部分範囲に分割します。
主に2つのシナリオがサポートされています:
-
viewが
input_rangeで、デリミタが単一要素(single_viewでラップされたもの)の場合。 -
viewが
forward_rangeで、デリミタが要素のviewの場合。
Pattern
が
sized_range
を満たし、
Pattern
::
size
(
)
が定数式でありテンプレート定数引数として適切であり、かつ
Pattern
::
size
(
)
の値が
1
以下である場合に満たされる。特に、
empty_view
と
single_view
はこのコンセプトを満たす。
lazy_split_view
は、基盤となる
view
V
がそれぞれのコンセプトを満たす場合、
forward_range
および
input_range
コンセプトをモデルし、
V
が
forward_range
と
common_range
の両方を満たす場合には
common_range
もモデルする。
内部の範囲(
ranges::
range_reference_t
<
lazy_split_view
>
)は、基盤となる
view
V
がそれぞれのコンセプトをモデルする場合、
forward_range
および
input_range
コンセプトをモデルします。
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) |
|
std::ranges::view_interface から継承 |
|
派生ビューが空かどうかを返す(
sized_range
または
forward_range
を満たす場合のみ提供)
(
std::ranges::view_interface<D>
のpublic member function)
|
|
|
(C++23)
|
範囲の先頭を指す定数イテレータを返す
(
std::ranges::view_interface<D>
のpublic member function)
|
|
(C++23)
|
範囲の定数イテレータ用センチネルを返す
(
std::ranges::view_interface<D>
のpublic member function)
|
|
派生ビューが空でないかどうかを返す(
ranges::empty
が適用可能な場合のみ提供)
(
std::ranges::view_interface<D>
のpublic member function)
|
|
派生ビューの最初の要素を返す(
forward_range
を満たす場合のみ提供)
(
std::ranges::view_interface<D>
のpublic member function)
|
|
ネストされたクラス
|
イテレータ型
( 説明専用メンバクラステンプレート* ) |
|
|
内部範囲のイテレータ型
( 説明専用メンバクラステンプレート* ) |
推論ガイド
注記
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) |