嗨我写了以下函数添加2个向量
vector<double> add(vector<double>& v1, vector<double>& v2 )
{ /*Do quick size check on vectors before proceeding*/
vector<double> result(v1.size());
for (unsigned int i = 0; i < result.size(); ++i)
{
result[i]=v1[i]+v2[i];
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试用以下两种方式添加3个矢量a,b,c,它们都具有相同的大小
vector <double> sum1, sum2;
sum1=add(b,c);
sum2=add(a,sum1);
Run Code Online (Sandbox Code Playgroud)
哪个有效
和
vector <double> sum;
sum=add(a,add(b,c));
Run Code Online (Sandbox Code Playgroud)
这给了我以下编译器错误
g++ -Wall simple.cpp
simple.cpp: In function ‘int main(int, char**)’:
simple.cpp:45: error: invalid initialization of non-const reference of type ‘std::vector<double, std::allocator<double> >&’ from a temporary of type ‘std::vector<double, std::allocator<double> >’
simple.cpp:16: error: in passing argument 2 of ‘std::vector<double, std::allocator<double> > add(std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&)’
Run Code Online (Sandbox Code Playgroud)
为什么第二种方法不起作用?
vector<double> add(vector<double> v1, vector<double> v2 )
Run Code Online (Sandbox Code Playgroud)
从错误消息中,我可以100%肯定地说这不是原始代码中的函数签名.
在原始代码中,您必须使用此代码:
vector<double> add(vector<double> & v1, vector<double> & v2 )
Run Code Online (Sandbox Code Playgroud)
如果是这样,那么将其设为:
vector<double> add(const vector<double> & v1, const vector<double> & v2)
Run Code Online (Sandbox Code Playgroud)
现在它应该工作得很好.
返回值add()是临时对象,临时对象不能绑定到非const引用.这就是编译器给出错误的原因.如果你写这个会给出同样的错误:
vector<double> & v = add(a,b); //error
Run Code Online (Sandbox Code Playgroud)
但是,如果临时对象可以绑定const引用.这就是为什么我建议你做参数const参考.这意味着,你可以这样写:
const vector<double> & v = add(a,b); //ok
Run Code Online (Sandbox Code Playgroud)
此外,您还可以使参数非const非引用,即通过值传递参数.但我不建议这样做,因为它涉及不必要的载体副本.
最好的解决方案是:
vector<double> add(const vector<double> & v1, const vector<double> & v2)
Run Code Online (Sandbox Code Playgroud)
你也可以operator+为vector 重载,如:
vector<double> operator + (const vector<double>& v1, const vector<double>& v2 )
{
/*Do quick size check on vectors before proceeding*/
vector<double> result(v1.size());
for (unsigned int i = 0; i < result.size(); ++i)
{
result[i]=v1[i]+v2[i];
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果你重载这个,那么你可以写这个很酷的代码:
vector<double> c = a + b;
vector<double> d = a + b + c;
vector<double> e = a + b + c + d;
//so on
Run Code Online (Sandbox Code Playgroud)
不是很有趣吗?
正如@Gene评论的那样,您可以std::transform在函数中使用:
vector<double> operator+(const vector<double>& v1, const vector<double>& v2 )
{
vector<double> result;
std::transform(v1.begin(),v1.end(),v2.begin(),
std::back_inserter(result), std::plus<double>);
return result;
}
Run Code Online (Sandbox Code Playgroud)