是否在c++中返回一个vector

does returning a vector in c++ append?

本文关键字:一个 vector c++ 返回 是否      更新时间:2023-10-16

我正在使用c++中的矢量,我提出了以下我不太理解的MWE:

#include <iostream>  
#include <vector>
using namespace std;
vector<double> pb()
{
    vector<double> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    return a;
}
int main()
{
    vector<double> asd;
    asd = pb();
    cout << asd.size() << endl;
    asd = pb();
    cout << asd.size() << endl; //WHY DOES THIS GIVE 3, AND NOT 6? asd HAS NOT BEEN EMPTIED AT ANY POINT

    return 0;
}

我不明白的是为什么每次我调用pb()时,我的向量asd都是"初始化"的。我所期望的是调用pb()只会附加到asd的内容。

在函数pb中,您创建了一个新的向量,并将三个项目推入其中,然后返回它。然后将其复制到main函数中的asb并删除旧内容。

函数pb如何知道它应该附加到向量上?它不是。你必须把它传递给函数。

void pb(std::vector<double>& a)
{
    // Push back items...
}
int main()
{
    std::vector<double> asd;
    pb(asd);
    // ...
}
如您所见,我将函数更改为而不是返回向量。而是作为引用参数传递。

不是每次都"初始化";它用函数调用的结果重新赋值,其中包含3个项。旧的内容在重新分配时被销毁。

如果要追加,请使用append成员函数而不是重新赋值。或者,将引用传递给函数并附加到其上,而不是附加到新向量上。

长话短说,这应该会给你想要的答案:

vector<double> pb(vector<double> &a)
{
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
}
int main()
{
    vector<double> asd;
    pb( asd );
    cout << asd.size() << endl;
    pb( asd );
    cout << asd.size() << endl; //WHY DOES THIS GIVE 3, AND NOT 6? asd HAS NOT BEEN EMPTIED AT ANY POINT
    return 0;
}

长故事:每次在原始版本的代码中调用pb()时,都要创建一个新的 std::vector,然后将其推送到新的vector。在pb()返回后,asd赋值给新创建的&填充vector,而不是追加到。