这个问题非常愚蠢,但我需要以非常有效的方式完成它 - 它将在我的代码中重复执行.我有一个返回向量的函数,我必须逐个元素地将返回的值添加到另一个向量.非常简单:
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)
迭代,result
并result_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+=
重载.
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)
归档时间: |
|
查看次数: |
48794 次 |
最近记录: |