您好,我编写了以下用于添加 2 个 vector 的函数
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;
}
现在我尝试通过以下两种方式添加 3 个大小相同的 vector a,b,c
vector <double> sum1, sum2;
sum1=add(b,c);
sum2=add(a,sum1);
有效
和
vector <double> sum;
sum=add(a,add(b,c));
这给了我以下编译器错误
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> >&)’
为什么第二种方法不行?
最佳答案
vector<double> add(vector<double> v1, vector<double> v2 )
根据错误消息,我可以 100% 肯定地说这不是您原始代码中的函数签名。
在你的原始代码中,你必须使用这个:
vector<double> add(vector<double> & v1, vector<double> & v2 )
如果是这样,那么把它变成:
vector<double> add(const vector<double> & v1, const vector<double> & v2)
现在它应该可以正常工作了。
说明:
add()
的返回值是一个临时对象,临时对象不能绑定(bind)到非const 引用。这就是编译器给出错误的原因。如果你这样写,它会给出同样的错误:
vector<double> & v = add(a,b); //error
但是,如果临时对象可以绑定(bind)到const
引用。这就是为什么我建议您对参数 const
进行引用。这意味着,您可以这样写:
const vector<double> & v = add(a,b); //ok
此外,您还可以使参数成为非常量非引用,即按值 传递参数。但我不建议这样做,因为它涉及到载体的不必要的拷贝。
最好的解决办法是这样的:
vector<double> add(const vector<double> & v1, const vector<double> & v2)
熟悉运算符+
您还可以为 vector 重载 operator+
,如:
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;
}
如果你重载它,那么你可以编写这个很酷的代码:
vector<double> c = a + b;
vector<double> d = a + b + c;
vector<double> e = a + b + c + d;
//so on
是不是很好玩?
熟悉标准算法..
正如@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;
}
关于c++ - 添加 vector c++。无法理解编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7519836/