使用带功能的向量,指针问题

时间:2014-10-05 18:16:34

标签: c++ pointers vector

当涉及到这些点和载体时,我已经完全糊涂了并且感到困惑。

我有两个功能

 vector<int>& add(vector<int>& num1, vector<int>& num2){

     vector<int> ansVec;
     ....
     return ansVec;
 }

vector<int>& multiply(vector<int>& num1, vector<int>& num2){
    ...
    return add( multiply(num1, num2), multiply(num1, num2));
}

问题似乎是我正在返回对局部变量的引用。 我怎么能传递整个矢量,而不仅仅是参考?

3 个答案:

答案 0 :(得分:1)

你不能总是通过引用返回, 以下是您的问题的一些解决方案:

1)将结果放入容器参数:

void add(vector<int>& num1, vector<int>& num2 ,vector<int>* result)

并使用计算结果填充结果向量

2)按值返回:

vector<int> add(vector<int>& num1, vector<int>& num2);

请注意,您实际上将每个元素从用于计算的临时向量复制到返回的向量

3)将指针(或某种智能指针)返回到堆上分配的向量

vector<int>* add(vector<int>& num1, vector<int>& num2)
{
vector<int>* res = new vector<int>();
...
return res ;
}

请注意,此代码的客户端不得忘记删除向量

或者,例如使用 boost :: shared_ptr ,或者 std :: shared_ptr ,如果你有c ++ 11:

shared_ptr<vector<int>> add(vector<int>& num1, vector<int>& num2)
{

shared_ptr<vector<int>> res (new vector<int>());
...
return res ;
}

答案 1 :(得分:0)

我认为你最好使用std算法来进行矢量的加法/乘法,例如使用std :: transform添加两个向量或用于乘法

//Add vec1 and vec2 and store the results in result vec
//Note: take care of the ranges of two sources/destination
transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), std::plus<int>());

您的代码问题:

  1. 返回本地变量的引用
  2. 乘法没有终止条件。

答案 2 :(得分:0)

在C ++ 11中,生活更轻松。只是按价值回报。它将自动应用移动语义而不是复制语义。复制矢量很昂贵,但移动它们很便宜。除非您愿意分析您的代码并证明它是一个瓶颈,否则不要打扰指针或引用。在这里使用指针或引用会混淆代码,并且是一种过早的优化。

请参阅此演讲:https://www.youtube.com/watch?v=xnqTKD8uD64。他接受了这个确切的问题,并建议按价值返回任何便宜的移动类型。

编辑:当我说不打扰引用/指针时,我的意思是返回。将const引用传递给输入参数的向量,将非const引用传递给输入/输出参数的向量,是标准和良好实践。