lazy_split_view 类(C++ 标准库)

根据分隔符将范围拆分为子范围。 分隔符可以是单个元素或元素视图。 分隔符不是生成的子范围的一部分。

split_viewlazy_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_rangetiny_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 可迭代时

成员

成员函数 描述
构造函数 构造视图。
baseC++20 获取基础范围。
beginC++20 获取指向视图中第一个元素的迭代器。
endC++20 获取视图末尾的 sentinel。
view_interface 继承 描述
emptyC++20 测试视图是否为空。
frontC++20 获取第一个元素。
operator boolC++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
要拆分的范围。

返回值

包含一个或多个 subrangelazy_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>

参数

无。

返回值

指向视图中第一个元素的迭代器。

包含元素 10、20 和 30 的矢量的图片。第一个元素包含 10,被标记为 begin()。最后一个元素包含 30,被标记为“last element”。最后一个元素之后的虚框指示 sentinel,被标记为 end()。

end

获取视图末尾的 sentinel。

1) constexpr auto end() const;
2) constexpr auto end() requires forward_range<V> && common_range<V>;

参数

无。

返回值

视图中最后一个元素后面的 sentinel:

包含元素 10、20 和 30 的矢量的图片。第一个元素包含 10,被标记为 begin()。最后一个元素包含 30,被标记为“last element”。最后一个元素之后的虚框指示 sentinel,被标记为 end()。

注解

2) forward_range<V> 要求意味着视图 V 至少具有向前迭代器。 有关范围迭代器的详细信息,请参阅视图类特征common_range<V> 要求意味着视图 V 具有相同的迭代器和 sentinel 类型。

另请参阅

<ranges>
lazy_split 范围适配器split_view
视图类