我有许多不同大小的矢量容器,每个容器都包含双打。 我想添加每个向量的元素来创建一个向量 双打。这个简单的例子将举例说明我所说的:
考虑两个向量A,其中三个元素为3.0 2.0 1.0,B为两个元素 2.0 1.0。我想添加两个向量从最后一个元素开始并工作 向后。这将为数组C提供条目3.0 4.0 2.0。
这样做最优雅/最有效的方法是什么?
谢谢!
答案 0 :(得分:4)
尝试使用迭代器:
#include <vector>
void add(
std::vector<double>& result,
const std::vector<double>& a,
const std::vector<double>& b)
{
std::vector<double>::const_reverse_iterator sit;
std::vector<double>::const_reverse_iterator send;
// copy the larger vector
if (a.size() > b.size() ) {
result = a;
sit = b.rbegin();
send = b.rend();
}
else {
result = b;
sit = a.rbegin();
send = a.rend();
}
// add the smaller one, starting from the back
for (std::vector<double>::reverse_iterator it = result.rbegin();
sit != send;
++it, ++sit)
{
*it += *sit;
}
}
答案 1 :(得分:4)
一旦你知道你有一个比另一个更大的载体
std::vector<double> new_vector = bigger_vector; // Copy the largest
std::transform(smaller_vector.rbegin(), smaller_vector.rend(), // iterate over the complete smaller vector
bigger_vector.rbegin(), // 2nd input is the corresponding entries of the larger vector
new_vector.rbegin(), // Output is the new vector
std::plus<double>()); // Add em
这很好,因为您不必执行任何循环缩进,并且可以在任何支持反向迭代器的序列容器上工作。
答案 2 :(得分:3)
将较大的矢量复制到C中,然后将(+ =)较小的元素添加到C的相关元素中。
像:
std::vector<double> add(const std::vector<double>& a,
const std::vector<double>& b)
{
std::vector<double> c( (a.size() > b.size()) ? a : b );
const std::vector<double>& aux = (a.size() > b.size() ? b : a);
size_t diff = c.size() - aux.size();
for (size_t i = diff; i < c.size(); ++i)
c[i] += aux[i-diff];
return c;
}
编辑根据以下评论反对使用[]与迭代器。
我个人认为迭代器对于这样的事情过于冗长,但如果你喜欢它们,那么你可以尝试类似下面的事情:
std::vector<double> add(const std::vector<double>& a,
const std::vector<double>& b)
{
std::vector<double> c( (a.size() > b.size()) ? a : b);
std::vector<double>::reverse_iterator c_i;
const std::vector<double>& aux = (a.size() > b.size()) ? b : a;
std::vector<double>::const_reverse_iterator aux_i;
for (c_i=c.rbegin(), aux_i=aux.rbegin(); aux_i!=aux.rend(); ++c_i, ++aux_i)
*c_i += *aux_i;
return c;
}
我没有测试或编译其中任何一个,但我认为你明白了。