c++ - 添加 vector c++。无法理解编译错误

标签 c++ vector

您好,我编写了以下用于添加 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/

相关文章:

c++ - 使用指向类 T 成员的函数指针作为模板类 <T> 函数中的参数的不良做法?

c++ - 包含模板数据而不使用模板类

java - 如何将 vector 中的元素放入ArrayList中

c++ - 列表元素被替换而不是插入

math - 计算直线垂线上的点的笛卡尔坐标

c++ - 如何使用迭代器和 find/find_f 在类的 C++ vector 中查找实际值

c++ - 赢得 CE : Creating Named Shared Memory

c++ - C++将字符串转换为int

c++ - 这个返回语句是做什么的?

c++ - 如何填充类型为 "User"的 vector ,该 vector 具有 2 个分量 "username"和 "password"