我有两个相同大小的std::vector<double>
代表不同的系列。
有没有干净的方法来使用STD对这些向量求和?
类似std::accumulate
的内容,但适用于两个系列。
答案 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);
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.);
}
}