如何逐个元素添加两个STL向量?

Iva*_*van 26 c++ stl vector

这个问题非常愚蠢,但我需要以非常有效的方式完成它 - 它将在我的代码中重复执行.我有一个返回向量的函数,我必须逐个元素地将返回的值添加到另一个向量.非常简单:

vector<double> result;
vector<double> result_temp
for(int i=0; i< 10; i++) result_temp.push_back(i);

result += result_temp //I would like to do something like that.
for(int i =0; i< result_temp.size();i++)result[i] += result_temp[i]; //this give me segfault
Run Code Online (Sandbox Code Playgroud)

我正在尝试的数学运算是

u [i] = u [i] + v [i]为所有我

可以做些什么?

谢谢

编辑:添加了一个简单的初始化,因为这不是重点.应如何初始化结果?

Jon*_*eid 35

肯定看起来问题是访问result不存在的值.tzaman展示了如何将结果初始化为10个元素,每个元素的值为0.

现在你需要调用transform函数(来自<algorithm>),应用plus函数对象(来自<functional>):

std::transform(result.begin(), result.end(), result_temp.begin(),
               result.begin(), std::plus<double>());
Run Code Online (Sandbox Code Playgroud)

迭代,resultresult_temp应用plus添加双精度,并将总和写回result.


Jam*_*lis 31

如果您尝试将一个附加vector到另一个,则可以使用以下内容.这些来自我的一个实用程序库 - 两个operator+=重载std::vector:一个附加一个元素vector,另一个附加整个vector:

template <typename T>
std::vector<T>& operator+=(std::vector<T>& a, const std::vector<T>& b)
{
    a.insert(a.end(), b.begin(), b.end());
    return a;
}

template <typename T>
std::vector<T>& operator+=(std::vector<T>& aVector, const T& aObject)
{
    aVector.push_back(aObject);
    return aVector;
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试执行求和(即创建vector包含其他两个元素的总和的new vector),则可以使用以下内容:

#include <algorithm>
#include <functional>

template <typename T>
std::vector<T> operator+(const std::vector<T>& a, const std::vector<T>& b)
{
    assert(a.size() == b.size());

    std::vector<T> result;
    result.reserve(a.size());

    std::transform(a.begin(), a.end(), b.begin(), 
                   std::back_inserter(result), std::plus<T>());
    return result;
}
Run Code Online (Sandbox Code Playgroud)

您可以类似地实现operator+=重载.

  • 为什么会这么慢? (3认同)
  • @Ivan:看编辑; 在看到你对Greg回答的评论之前,我并不完全确定你在寻找什么. (2认同)
  • @James忽略我原来的评论 - 现在你有了花哨的相关代码:) (2认同)
  • 如果这比手动循环慢,我会感到惊讶.(假设您在启用优化的情况下进行编译) (2认同)

ger*_*rdw 8

Jon Reid回答的一个具体例子:

std::array<double,3> a = {1, 2, 3};
std::array<double,3> b = {4, 5, 6};
std::transform(a.begin( ), a.end( ), b.begin( ), a.begin( ),std::plus<double>( ));
ASSERT_TRUE(a[0] == 5);
ASSERT_TRUE(a[1] == 7);
ASSERT_TRUE(a[2] == 9);
Run Code Online (Sandbox Code Playgroud)