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

5ktev3wc  于 2023-03-14  发布在  其他
关注(0)|答案(2)|浏览(200)

cp首选项states ...
范围库是算法和迭代器库的扩展和泛化,通过使它们可组合且不易出错而使它们更强大。
该库创建并操作范围视图,即间接表示可迭代序列(范围)的轻量级对象。
它提到了使用范围视图,作为cppreferencestates
范围概念定义了类型的要求,该类型通过提供表示范围元素的迭代器和标记来允许在其元素上进行迭代。
但是从外部的Angular 看,它看起来就像是一个带有concept的迭代器的 Package 器,所以问题如下:

  • 这真的是全部吗?
  • 使用范围库解决的常规迭代器有什么问题(代码示例将被欣赏)?
  • 什么时候用呢?
  • 这是怎么回事:
std::vector <int> v { 1, 2, 3, 4, 5 };

std::for_each(v.begin(), v.end(), [](const int& i) { std::cout << i << " "; });

是否与此不同:

std::ranges::for_each(v, [](const int& i) { std::cout << i << " "; });

(除了略短的形式)

ekqde3dh

ekqde3dh1#

第二种方法允许您将只存在于range头中的其他操作进行管道传输,这对于可组合性来说要好得多:

#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 
}
lmvvr0a8

lmvvr0a82#

使用范围库解决的常规迭代器有什么问题(代码示例将被欣赏)?
这样可以避免临时容器的一些错误:

// assuming std::vector<int> compute_vector();

// Following is wrong begin and end refers to different (temporary) containers
const bool KO = std::is_sorted(compute_vector().begin(), compute_vector().end()); // WRONG

// Here all is ok.
const bool OK = std::ranges::is_sorted(compute_vector());

相关问题