当涉及到这些点和载体时,我已经完全糊涂了并且感到困惑。
我有两个功能
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));
}
问题似乎是我正在返回对局部变量的引用。 我怎么能传递整个矢量,而不仅仅是参考?
答案 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>());
您的代码问题:
答案 2 :(得分:0)
在C ++ 11中,生活更轻松。只是按价值回报。它将自动应用移动语义而不是复制语义。复制矢量很昂贵,但移动它们很便宜。除非您愿意分析您的代码并证明它是一个瓶颈,否则不要打扰指针或引用。在这里使用指针或引用会混淆代码,并且是一种过早的优化。
请参阅此演讲:https://www.youtube.com/watch?v=xnqTKD8uD64。他接受了这个确切的问题,并建议按价值返回任何便宜的移动类型。
编辑:当我说不打扰引用/指针时,我的意思是返回。将const引用传递给输入参数的向量,将非const引用传递给输入/输出参数的向量,是标准和良好实践。