C++:添加新结构时,结构指针向量中的所有元素都会更新



我正在尝试编写一个相对简单的程序,我可以在其中将struct添加到C++中的向量中,编辑它们并从中读取。

#include <iostream>
#include <vector>
using namespace std;
struct a {
int e;
string msg;
};
int main()
{
vector<a*> lists;
for (int f = 0; f < 4; ++f) {
a b;
b.e = f;
b.msg = "J";
lists.push_back(&b);
}
for (auto g : lists) {
cout << g->e << g->msg << endl;
}
return 0;
}

最初,我尝试使用vector<struct>,但在发现您无法以这种方式编辑struct后,我将其转换为包含指向struct的指针的向量。

我希望上面的代码能够产生:

0J
1J
2J
3J

但它最终产生:

3
3
3
3

经过一番检查,我确定每次向量添加新元素时,所有其他元素都会更新,成为新元素的精确副本。

如果我将第二个 for 循环移动到第一个 for 循环中,我会得到:

0J
1J
1J
2J
2J
2J
3J
3J
3J
3J

有谁知道这是为什么?

我想我明白你的意思,我曾经遇到过同样的问题。我发现发生这种情况的原因是因为对象是在 for 循环中创建的,因此vector内部的信息指向相同的内存地址,因此为其中的所有对象显示相同的信息(请注意,您没有结构向量,您有指针向量(。

无论如何,我解决这个问题的方法:我创建了一个包含新对象定义的函数,for 循环将调用该函数,因此它指向的内存地址每次都会不同。(可能有更有效的方法来解决这个问题,但这奏效了(。

它看起来像这样:

struct StructName{
//any attribs
}
StructName* ObjectFactory
{
StructName *newobject = new StructName;
return newobject;
}

现在,它应该在每次迭代中指向不同的内存地址,如果您正在寻找指针向量。

最新更新