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++ - 如何在 Eclipse 中使用 nix

c# - 当在后台线程上创建的 Dispatcher 没有关闭时会发生什么?如何确保调度程序正确关闭?

c++ - 为什么 CSIDL_PERSONAL 在这行代码中是一个整数?

c++ - 解析挤出方向 vector DXF

haskell - FFI 中的可变数据和惰性

c++ - 从文本文件中读取 float 并复制到 float vector

c++ - 静态链接 SSL 与 Poco

c++ - 用于音频文件流的 FFMPEG 命令

c++ - 如何将初始化的结构放入结构中?

r - 向量化矩阵