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 { inlineconstexpr/* unspecified */ lazy_split =/* unspecified */; | (2) | (C++20 起) |
调用签名 | ||
template<ranges::viewable_range R, class Pattern > requires /* 见下文 */ | (C++20 起) | |
template<class Pattern > constexpr/* range adaptor closure */ 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
时,仅用于阐释的概念 /*tiny-range*/<Pattern> 得到满足。值得注意的是 empty_view
与 single_view
满足此概念。当底层 view
V
实现概念 forward_range
和 input_range
时,lazy_split_view
实现相应概念,并且当 V
一同实现 forward_range
与 common_range
时,lazy_split_view
实现 common_range
。
当底层 view
V
实现概念 forward_range
和 input_range
时,内层范围(ranges::range_reference_t<lazy_split_view>)实现相应的概念。它不实现 common_range
,并且不能用于期待 bidirectional_range
或更高要求范围的算法。
与 split_view
不同,lazy_split_view
并不保持子范围的连续性。
目录 |
[编辑]数据成员
成员 | 描述 |
V base_ (私有) | 底层 view (仅用于阐述的成员对象*) |
Pattern pattern_ (私有) | 用作切割底层 view 的分隔符的模式(仅用于阐述的成员对象*) |
non-propagating-cache<ranges::iterator_t<V>>current_ (私有)(仅当 V 不满足 forward_range 时才存在) | 缓存调用 begin() 的结果的对象(仅用于阐述的成员对象*) |
[编辑]成员函数
构造 lazy_split_view (公开成员函数) | |
返回底层(适配的)视图的副本 (公开成员函数) | |
返回指向起始的迭代器 (公开成员函数) | |
返回 指向末尾的迭代器或哨位 (公开成员函数) | |
继承自 std::ranges::view_interface | |
返回视图是否为空,仅当视图满足 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 =[](autoconst& view){// `view` 是 std::views::lazy_split_view::__outer_iterator::value_type for(std::cout<<"{ ";constauto element : view)std::cout<< element <<' ';std::cout<<"} ";}; int main(){constexprstaticauto source ={0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9};constexprint delimiter{0};constexpr std::ranges::lazy_split_view outer_view{source, delimiter};std::cout<<"切割["<< std::ranges::distance(outer_view)<<"]: ";for(autoconst& inner_view: outer_view) print(inner_view); constexprstd::string_view hello{"Hello C++ 20 !"};std::cout<<"\n""子字符串: "; std::ranges::for_each(hello | std::views::lazy_split(' '), print); constexprstd::string_view text{"Hello-+-C++-+-20-+-!"};constexprstd::string_view delim{"-+-"};std::cout<<"\n""子字符串: "; std::ranges::for_each(text | std::views::lazy_split(delim), print);}
输出:
切割[5]: { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 } 子字符串: { H e l l o } { C + + } { 2 0 } { ! } 子字符串: { H e l l o } { C + + } { 2 0 } { ! }
[编辑]缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
P2210R2 | C++20 | 旧的 split_view 过于惰性而无法易用 | 将其功能移动到 lazy_split_view |
[编辑]参阅
用某个分隔符切割另一 view 所获得的子范围的 view (类模板)(范围适配器对象) | |
(C++20) | 由拉平 range 组成的 view 所获得的序列构成的 view (类模板)(范围适配器对象) |