我正在使用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
的内容。
答案 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
,而不是附加到。