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++ - 未定义的静态变量引用 C++

c++ - 带有静态 std::vector 的内存泄漏(有点)

c++ LNK2019错误,未解析的外部字符

c++ - 如果已知到平面上各个点的距离,则估计平面方程

c++ - 给定一个数组,找出它可以除以或除以数组剩余元素的元素数

c++ - 可在 CUDA 中使用的数组大小是否有限制?

c++ - 使用for循环c++声明一个对象数组

c++ - 系统库的 scons 链接器错误

actionscript-3 - 在 ActionScript 3 中对对象向量进行排序

c++ - 运行 Cython 的问题