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 /* unspecified */ lazy_split = /* unspecified */; |
(2) | (自 C++20 起) |
调用签名 |
||
template< ranges::viewable_range R, class Pattern > requires /* see below */ |
(自 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
。值得注意的是,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
或更高版本的算法一起使用。
内容 |
[编辑] 数据成员
成员名称 | 定义 |
base_ (私有) |
底层 view ,类型为 V 。(仅供说明用途的成员对象*) |
pattern_ (私有) |
用作分隔符来分割底层 view 的模式。(仅供说明用途的成员对象*) |
current_ (私有)(条件存在) |
一个 类似可选的 缓存对象,类型为 /*non-propagating-cache*/<ranges::iterator_t<V>>。缓存对 begin() 的调用结果。仅当 V 不满足 forward_range 时才存在。(仅供说明用途的成员对象*) |
[编辑] 成员函数
构造一个 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` is of 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 |
[编辑] 参见
一个 view ,它包含通过使用分隔符拆分另一个 view 获得的子范围(类模板) (范围适配器对象) | |
(C++20) |
一个 view ,它包含从扁平化一个 view (它包含 range )获得的序列(类模板) (范围适配器对象) |