总结两个系列的STD方式

时间:2015-05-19 04:40:35

标签: c++ c++11

我有两个相同大小的std::vector<double>代表不同的系列。

有没有干净的方法来使用STD对这些向量求和?

类似std::accumulate的内容,但适用于两个系列。

3 个答案:

答案 0 :(得分:3)

以下是两个答案,取决于输出应该是向量的总和,还是它们的标量和(在这种情况下,我不确定为什么相关它们是相等的长度)。

矢量和

binary version of std::transform

怎么样?
std::vector<double> res(lhs.size());

std::transform(
     lhs.begin(), lhs.end(),
     rhs.begin(),
     res.begin(),
     [](double l, double r){return l + r;});

请注意,您可以使用functional中的std::plus<double>()代替lambda。

标量总和

要么像

一样
auto sum = std::accumulate(std::begin(lhs), std::end(lhs), 0.0) + 
     std::accumulate(std::begin(rhs), std::end(rhs), 0.0);

或使用boost::range::join

auto both = boost::range::join(lhs, rhs);
auto sum = std::accumulate(std::begin(both), std::end(both), 0.0);

答案 1 :(得分:2)

我强烈建议您只使用两个accumulate并添加结果。它更具可读性。

如果你真的坚持,因为你的矢量长度相同,你可以滥用std::inner_product

double result = std::inner_product(veca.begin(), veca.end(), vecb.begin(),
                                   0.0, std::plus<double>(), std::plus<double>());

答案 2 :(得分:0)

我会保持简单,只需调用两次累积,你可以将它添加到一个单独的函数中,为你处理它。 它更具可读性,每个人都能够在第一眼就能理解它。

namespace util{
  double accumulate(std::vector<double>& a, std::vector<double>& b)
  {
    return std::accumulate(a.begin(), a.end(), 0.) + std::accumulate(b.begin(), b.end(), 0.);
  }
}