C++ 在函数中使用向量,指针问题

C++ 在函数中使用向量,指针问题,c++,pointers,vector,C++,Pointers,Vector,当涉及到这些点和向量时,我已经完全搞糊涂了 我有两个功能 vector<int>& add(vector<int>& num1, vector<int>& num2){ vector<int> ansVec; .... return ansVec; } vector&add(vector&num1,vector&num2){ 向量ansVec; .... 返回ansVec; } 及 向

当涉及到这些点和向量时,我已经完全搞糊涂了

我有两个功能

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

     vector<int> ansVec;
     ....
     return ansVec;
 }
vector&add(vector&num1,vector&num2){
向量ansVec;
....
返回ansVec;
}

向量和乘法(向量和num1,向量和num2){
...
返回加法(乘法(num1,num2),乘法(num1,num2));
}
问题似乎是我返回了对局部变量的引用。
如何传递整个向量,而不仅仅是引用?

我认为最好使用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>());
//添加vec1和vec2并将结果存储在result vec中
//注意:注意两个来源/目的地的范围
转换(vec1.begin()、vec1.end()、vec2.begin()、result.begin()、std::plus());
代码的问题:

  • 返回局部变量的引用
  • 乘法没有终止条件

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

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

    void add(vector<int>& num1, vector<int>& num2 ,vector<int>* result)
    
    void add(向量和num1,向量和num2,向量*结果)
    
    并用计算结果填充结果向量

    2)按值返回:

    vector<int> add(vector<int>& num1, vector<int>& num2);
    
    vector add(vector&num1,vector&num2);
    
    请注意,这里实际上是将用于计算的临时向量中的每个元素复制到返回的向量中

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

    vector<int>* add(vector<int>& num1, vector<int>& num2)
    {
    vector<int>* res = new vector<int>();
    ...
    return res ;
    }
    
    vector*add(vector&num1,vector&num2)
    {
    向量*res=新向量();
    ...
    返回res;
    }
    
    注意,在这里,这段代码的客户端一定不要忘记删除向量

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

    shared_ptr<vector<int>> add(vector<int>& num1, vector<int>& num2)
    {
    
    shared_ptr<vector<int>> res (new vector<int>());
    ...
    return res ;
    }
    
    shared_ptr add(向量和num1,向量和num2)
    {
    共享的ptr res(新向量());
    ...
    返回res;
    }
    
    在C++11中,生活更简单。只需按值返回。它将自动应用移动语义,而不是复制语义。复制向量很昂贵,但移动它们很便宜。除非您愿意分析代码并证明它是一个瓶颈,否则不要麻烦使用指针或引用。在这里使用指针或引用会混淆代码,是一种过早的优化

    请看以下对话:。他提出了这个确切的问题,并建议对任何便宜的移动类型按值返回


    编辑:当我说不要为引用/指针而烦恼时,我的意思是为了返回。将常量ref传递给输入参数的向量,将非常量ref传递给输入/输出参数的向量,这是标准且良好的做法。

    向量添加…
    但真正的问题似乎是
    乘法函数中的无限递归。如果大小为1,然后它返回函数中较高的一个数字。现在它有一个错误:错误:从“std::vector”类型的右值初始化“std::vector&”类型的非常量引用无效,很可能是因为
    vector&foo
    无法绑定
    vector&
    。根据引起问题的部件,您可能需要
    vector foo
    vector const&foo
    。真的,你可能想发布更大的代码片段,或者你能找到的最小的复制示例。你看过
    std::valaray
    而不是vector了吗?谢谢你的主意!我同意这样做会更好,但我希望了解如何在准备考试时手动操作!非常感谢。在C++中,在创建接口/方法时,要引用引用,指针是为您的类的内部表示。在返回新创建的资源时,使用<代码> UNQUIGYPTR ,而不是<代码> SyddYPPTR <代码>。从“唯一”到“共享”的转换很容易,但相反的转换是不可能的。你对2)的评论在11中是错误的。
    shared_ptr<vector<int>> add(vector<int>& num1, vector<int>& num2)
    {
    
    shared_ptr<vector<int>> res (new vector<int>());
    ...
    return res ;
    }