我正在尝试编写一个相对简单的程序,我可以在其中将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;
}
现在,它应该在每次迭代中指向不同的内存地址,如果您正在寻找指针向量。