确实在c ++中返回一个向量追加?

时间:2013-03-22 15:55:08

标签: c++ vector

我正在使用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;
}

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

3 个答案:

答案 0 :(得分:2)

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

函数pb如何知道它应该附加到向量?它没有。你必须将它传递给函数。

void pb(std::vector<double>& a)
{
    // Push back items...
}

int main()
{
    std::vector<double> asd;

    pb(asd);

    // ...
}

如您所见,我将功能更改为而不是返回向量。相反,它作为引用参数传递。

答案 1 :(得分:2)

每次都没有“初始化”;它被重新分配函数调用的结果,其中包含3个项目。旧内容在重新分配时会被销毁。

如果要追加,请使用append成员函数而不是重新分配。或者,传递对函数的引用并附加到该函数,而不是传递给新的向量。

答案 2 :(得分:1)

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

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分配到新创建的&amp;填充vector,而不是附加到。