您好我想制作2D网格代码。我有两个类顶点和元素。每个顶点应该有一个指向相邻元素的指针向量。此外,每个元素应该具有相邻顶点的指针向量。我做到了但是,当我尝试访问邻居时,我得到的结果不正确。 这是我的列表
#include <iostream>
#include <vector>
using namespace std;
struct A;
struct B;
struct A
{
vector<B*> vbs;
A(int aa)
{
a=aa;
}
int a;
};
struct B
{
vector<A*> vas;
B(int bb)
{
b=bb;
}
int b;
};
int main()
{
vector<A> VA;
vector<B> VB;
for(int i=0;i<11;i++)
{
VA.push_back(A(i));
VB.push_back(B(10-i));
VA.back().vbs.push_back(&VB.back());
VB.back().vas.push_back(&VA.back());
}
for(int i=0;i<11;i++)
{
cout<<"A["<< i<<"]= "<<VA[i].a
<<" :::: " <<VA[i].vbs.size() <<" :: " <<VA[i].vbs[0]->b <<endl;
}
for(int i=0;i<11;i++)
{
cout<<"B["<< i<<"]= " <<VB[i].b
<<" :::: " <<VB[i].vas.size() <<" :: " <<VB[i].vas[0]->a <<endl;
}
}
这是我案例的最小例子 ideone.com的结果是
A[0]= 0 :::: 1 :: 10
A[1]= 1 :::: 1 :: 9
A[2]= 2 :::: 1 :: -1216846712
A[3]= 3 :::: 1 :: -1216846728
A[4]= 4 :::: 1 :: 6
A[5]= 5 :::: 1 :: 5
A[6]= 6 :::: 1 :: 4
A[7]= 7 :::: 1 :: 3
A[8]= 8 :::: 1 :: 2
A[9]= 9 :::: 1 :: 1
A[10]= 10 :::: 1 :: 0
B[0]= 10 :::: 1 :: 0
B[1]= 9 :::: 1 :: 1
B[2]= 8 :::: 1 :: 17
B[3]= 7 :::: 1 :: 17
B[4]= 6 :::: 1 :: 193
B[5]= 5 :::: 1 :: 5
B[6]= 4 :::: 1 :: 6
B[7]= 3 :::: 1 :: 7
B[8]= 2 :::: 1 :: 8
B[9]= 1 :::: 1 :: 9
B[10]= 0 :::: 1 :: 10
当你注意到A [2],A [3],B [2],B [3]和B [4]不正确 我做错了什么。这可能是编译器中的错误
问候
答案 0 :(得分:0)
问题是,在一些push_back
调用之后,之前使用的指针变为无效,因为向量类需要重新分配数据。这涉及分配新的内存块并移动对象。
你可以通过两个步骤来解决问题,首先填充向量,然后只有指针,或者你可以存储索引而不是指针,或者使用vector<A*>
动态分配而不是{{1 }}
答案 1 :(得分:0)
更改向量的大小会使迭代器无效,因此指向向量元素的指针可能在此处无效:
VA.back().vbs.push_back(&VB.back());
VB.back().vas.push_back(&VA.back())
如果您正在做这样的事情,请重新考虑您的设计。在向量中存储指向元素的指针是一条危险的道路。
其他答案中给出了一些解决方案。另一个可能的解决方案是使用std::list
而不是vector
,因为list
迭代器不会失效(仅当列表中的项被删除时,迭代器才会被删除的项无效)
另一个解决方案是使用预期的最大项目数调用向量reserve()
。但是,如果向量的项目数超过保留金额,即使这样也是不稳定的。最好重新考虑你正在做的事情。