lazy_split_view
类(C++ 标准库)
根据分隔符将范围拆分为子范围。 分隔符可以是单个元素或元素视图。 分隔符不是生成的子范围的一部分。
split_view
与 lazy_split_view
之间的主要区别包括:
视图 | 可以拆分 const 范围 |
范围类型 |
---|---|---|
split_view |
否 | 支持 forward_range 或更高版本。 |
lazy_split_view |
是 | 支持 input_range 或更高版本。 |
lazy_split_view
变“延迟”的原因是它不先行预测下一个分隔符。 这意味着它可以支持 input_range
,而 split_view
至少要求 forward_range
。 这是因为 input_range
为单通道,而 forward_range
允许多通道迭代。
首选 split_view
,因为效率更高,除非必须拆分 const
范围。 在性能方面,split_view
更加高效。
与 split_view
相比,lazy_split_view
的迭代器递增和比较效率更低,但仍为 O(1)。 当分隔符之间的距离足够小,子范围能够适应 CPU 高速缓存时,split_view
的性能更佳,在这种情况下,分隔符预测先行实际上会预先缓存下一个子范围。
语法
template<input_range V, forward_range Pattern>
requires view<V> && view<Pattern> &&
indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> &&
(forward_range<V> || tiny_range<Pattern>)
class lazy_split_view : public view_interface<lazy_split_view<V, Pattern>>
模板参数
Pattern
用于指定分隔符序列的视图的类型。
(forward_range<V> || tiny-range <Pattern>)
要求意味着当基础范围不是 forward_range
时,分隔符必须为 tiny_range
。 tiny_range
是一个范围,其静态盘区的大小为 0 或 1。 tiny_range<T>
需要 sized_range<T>
,并且 T::size()
必须是小于或等于 1 的常量表达式。
V
基础视图的类型。
特征
有关下列条目的说明,请参阅视图类特征
范围适配器:基础范围:lazy_split
必须满足input_range
或更高的视图迭代器类别:与基础范围元素类型相同:大小集合range_reference_t<V>
:没有通用范围:是,当基础范围同时存在forward_range
且。common
借入范围:否 是 const
可迭代:仅当基础范围满足 forward_range
要求且为 const
可迭代时
成员
成员函数 | 描述 |
---|---|
构造函数 | 构造视图。 |
base C++20 |
获取基础范围。 |
begin C++20 |
获取指向视图中第一个元素的迭代器。 |
end C++20 |
获取视图末尾的 sentinel。 |
从 view_interface 继承 |
描述 |
empty C++20 |
测试视图是否为空。 |
front C++20 |
获取第一个元素。 |
operator bool C++20 |
测试视图是否不为空。 |
要求
标头: <ranges>
(自C++20以来)
命名空间:std::ranges
编译器选项:/std:c++20
或更高版本是必需的。
构造函数
构造 lazy_split_view
的实例
1) lazy_split_view() = default;
2) constexpr lazy_split_view(V base, Pattern pattern);
3) template<input_range R> requires constructible_from<V, views::all_t<R>> &&
constructible_from<Pattern, single_view<range_value_t<R>>>
constexpr lazy_split_view(R&& rg, range_value_t<R> e);
模板参数
Pattern
分隔符的类型。
R
范围的类型。
V
基础视图的类型。
参数
e
用于标识视图拆分位置的单个元素。 该元素不是生成的子范围的一部分。
base
基础视图。
pattern
用于标识视图拆分位置的元素视图。 元素视图不是生成的子范围的一部分。
rg
要拆分的范围。
返回值
包含一个或多个 subrange
的 lazy_split_view
实例。
备注
创建 lazy_split_view
的最佳方法是使用 views::lazy_split
范围适配器。 范围适配器是创建视图类的预期方法。 仅当要创建自己的自定义视图类型时,才会公开视图类型。
1) 创建没有元素的 lazy_split_view
。 基础视图是默认构造的。 base()
返回 V()
的副本。
2) 使用分隔符序列拆分视图来创建 lazy_split_view
。
3) 使用分隔符元素拆分视图来创建 lazy_split_view
。
示例: lazy_split_view
// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> rg{ 1, 2, 3, 1, 2, 3, 4, 5, 6 };
// pipe syntax using range adaptor
for (const auto& subrange : rg | std::views::split(3))
{
// Outputs:
// 1 2
// 1 2
// 4 5 6
for (const auto& elem : subrange)
{
std::cout << elem << ' ';
}
std::cout << '\n';
}
int delimiters[] = {2, 3};
for (auto splitRange : std::views::split(rg, delimiters)) // ctor syntax
{
// outputs 1 1 4 5 6
for (auto& i : splitRange)
{
std::cout << i << " ";
}
}
}
1 2
1 2
4 5 6
1 1 4 5 6
base
获取基础视图的副本。
// Uses a copy constructor to return the underlying view
1) constexpr V base() const & requires std::copy_constructible<V>;
// Uses a move constructor to return the underlying view
2) constexpr V base() &&;
参数
无。
返回
基础视图。
begin
获取指向视图中第一个元素的迭代器。
constexpr auto begin();
constexpr auto begin() const requires forward_range<V> && forward_range<const V>
参数
无。
返回值
指向视图中第一个元素的迭代器。
end
获取视图末尾的 sentinel。
1) constexpr auto end() const;
2) constexpr auto end() requires forward_range<V> && common_range<V>;
参数
无。
返回值
视图中最后一个元素后面的 sentinel:
注解
2) forward_range<V>
要求意味着视图 V
至少具有向前迭代器。 有关范围迭代器的详细信息,请参阅视图类特征。 common_range<V>
要求意味着视图 V
具有相同的迭代器和 sentinel 类型。