wil*_*ony 1 c++ c++20 std-ranges
我注意到,许多算法可以与范围一起使用,允许使用自定义类型的成员,而不需要 lambda 函数。所以,我很好奇是否std::ranges可以有效地使用std::list<>. 我认识到这std::list<>不是此类算法的首选数据结构,但对于其他问题,它更适合我的目的。
在 C++20 中,不同的范围可以根据其迭代器类型细分为
input_range、
forward_range、bidirectional_range、random_access_range、 和contiguous_rangebase 。范围越细化,支持的操作就越多,性能也就越高效。
std::list是 a bidirectional_range,因此任何需要 abidirectional_range及以下的 C++20 范围化算法都可以应用于它。
以为例ranges::transform<algorithm>
template<ranges::input_range R, std::weakly_incrementable O,
std::copy_constructible F, class Proj = std::identity>
requires /* */
constexpr unary_transform_result<ranges::borrowed_iterator_t<R>, O>
transform(R&& r, O result, F op, Proj proj = {});
Run Code Online (Sandbox Code Playgroud)
其中明确要求R必须建模input_range. 由于std::list模型更加精致bidirectional_range,因此它具有该算法支持的所有操作input_range,并且可以很好地与该算法配合使用。
再次以范围适配器ranges::transform_view为例<ranges>
template<ranges::input_range V, std::copy_constructible F>
requires /* */
class transform_view : public ranges::view_interface<transform_view<V, F>>;
Run Code Online (Sandbox Code Playgroud)
它只需要一个input_range,所以它可以与 一起使用std::list。值得注意的是,大多数范围适配器只需要底层范围来建模input_range(只有少数需要forward_range),因此std::list也可以很好地与它们配合。
至于效率,由于std::list仅支持前向和后向操作,因此将 C++20 范围实用程序应用于它的效率低于将其应用于诸如 的效率random_access_range,std::vector但它确实有效。