0

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

4

3 回答 3

2

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

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

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

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

    pb(asd);

    // ...
}

如您所见,我将函数更改为返回向量。相反,它作为参考参数传递。

于 2013-03-22T15:56:41.873 回答
2

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

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

于 2013-03-22T15:56:56.263 回答
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版本,然后推送到该新版本vectorpb()返回后,asd分配给新创建的 & 填充vector,而不是附加到。

于 2013-03-22T15:57:09.953 回答