嗨,我想为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]是错误的,我做错了。这是否可能是编译器中的错误
问候
更改向量的大小会使迭代器无效,因此指向向量元素的指针可能在此处无效:
VA.back().vbs.push_back(&VB.back());
VB.back().vas.push_back(&VA.back())
如果您正在做这样的事情,请重新考虑您的设计。在矢量中存储指向元素的指针是一条危险的道路。
其他答案中给出了一些解决方案。另一个可能的解决方案是使用astd::list
而不是vector
,因为list
迭代器不会无效(仅当删除列表中的项目时,迭代器才会对删除的项目无效)。
另一个解决方案是调用reserve()
具有最大预期项目数的向量。但是,如果矢量的项目数超过保留的数量,即使这样也很不稳定。最好重新考虑您在做什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句