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
按分隔符拆分为子范围。
支持两种主要场景:
-
当视图是
input_range时,分隔符为单一元素(包装在single_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
(公开成员函数) |
|
|
返回底层(适配的)视图的副本
(公开成员函数) |
|
|
返回指向起始位置的迭代器
(公开成员函数) |
|
|
返回指向末尾位置的迭代器或哨兵
(公开成员函数) |
|
继承自 std::ranges::view_interface |
|
返回派生视图是否为空(仅在满足
sized_range
或
forward_range
时提供)
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
|
(C++23)
|
返回指向范围起始的常量迭代器
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
(C++23)
|
返回范围常量迭代器的哨兵
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图是否非空(仅在
ranges::empty
适用于它时提供)
(
std::ranges::view_interface<D>
的公开成员函数)
|
|
返回派生视图中的首元素(仅在满足
forward_range
时提供)
(
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++ 标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| P2210R2 | C++20 |
旧的
split_view
过于惰性而难以使用
|
将其功能迁移至
lazy_split_view
|
参见
|
(C++20)
|
通过使用分隔符拆分另一个
view
获得的子范围构成的
view
(类模板) (范围适配器对象) |
|
(C++20)
|
由展平
range
s
的
view
所获得的序列构成的
view
(类模板) (范围适配器对象) |