为什么在C ++ 17中添加了std :: reduce?

时间:2017-11-06 19:11:36

标签: c++ std c++17

我正在寻找对#34;返回值"的含义的详尽解释。 Patients p = patient.getValue(Patients.class)的描述,根据cppreference.com,是:

enter image description here

也许在我能够正确理解背后的想法"返回价值"部分,我可以更好地确定std::reduce超过std::reduce的位置。

2 个答案:

答案 0 :(得分:30)

std::accumulate按顺序迭代容器,std:reduce可能不会。由于订单无法保证,std::reduce引入了额外的要求:

  

如果binary_op不是关联的或不可交换的,则行为是不确定的。如果binary_op修改任何元素或使[first;]中的任何迭代器无效,则行为是未定义的。最后],包括结束迭代器。

但是,std::reduce提供了支持并行化的重载,std::accumulate无法提供这些重载。 std::reduce允许您自动并行化您的操作,前提是它符合上述要求。

答案 1 :(得分:1)

  • 允许并行性是添加std :: reduce

  • 的主要原因
  • 还需要确保要与std :: reduce一起使用的操作都具有关联性 和可交换。

    • 例如,加法是关联的,当使用std :: reduce并行进行累加时,结果相同。
      100 + 50 + 40 + 10 = 200 (100 + 40) + (50 + 10) = 200

    • 但是减法不是关联的,std :: reduce可能会给出错误的结果。
      100 - 50 - 40 - 10 = 0 NOT SAME AS (100 - 40) - (50 - 10) = 20

  • 效率
    std::vector<double> v(100000, 0.1); double result = std::accumulate(v.begin(), v.end(), 0.0); double result = std::reduce(std::execution::par,v.begin(),v.end()) //Faster