添加载体c ++.无法理解编译错误

smi*_*dha 1 c++ vector

嗨我写了以下函数添加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)

为什么第二种方法不起作用?

Naw*_*waz 7

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 +

你也可以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)