为什么使用 std::ranges 算法而不是常规算法?

dnl*_*dnl 8 c++ algorithm stl std-ranges

cppreference状态

范围库是算法和迭代器库的扩展和泛化,通过使它们可组合且不易出错,使它们变得更加强大。

该库创建并操作范围视图,即间接表示可迭代序列(范围)的轻量级对象。

它提到使用范围视图,如 cppreference所述

范围概念定义了类型的要求,该类型允许通过提供表示范围元素的迭代器和标记来迭代其元素。

但从外部角度来看,它似乎只是带有concept. 所以主要问题是:

  • 使用范围库解决的常规迭代器有哪些问题(我们将不胜感激代码示例),以及何时应该使用它?

小智 7

第二个允许您通过管道传输仅存在于范围标头中的其他操作,这对于可组合性来说要好得多:

#include <ranges>
#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
    const auto v = std::vector{ 1, 2, 3, 4, 5 };
    const auto is_odd = [](const auto n){ return n % 2 == 1; };
    const auto square = [](const auto n){ return n * n; };
    const auto print = [](const auto n){ std::cout << n << " ";};
    std::ranges::for_each(
        v | std::ranges::views::filter(is_odd) | std::ranges::views::transform(square),
        print); // prints: 1 9 25 
}
Run Code Online (Sandbox Code Playgroud)