C++ 两个类都有指向每个类的指针向量

C++ 两个类都有指向每个类的指针向量,c++,pointers,vector,C++,Pointers,Vector,嗨,我想做一个二维网格的代码。我有两个类:顶点和元素。每个顶点都应该有一个指向相邻元素的指针向量。此外,每个元素都应该有指向相邻顶点的指针向量。我做到了。然而,当我尝试访问邻居时,我得到了错误的结果。 这是我的清单 #include <iostream> #include <vector> using namespace std; struct A; struct B; struct A { vector<B*> vbs; A(int aa

嗨,我想做一个二维网格的代码。我有两个类:顶点和元素。每个顶点都应该有一个指向相邻元素的指针向量。此外,每个元素都应该有指向相邻顶点的指针向量。我做到了。然而,当我尝试访问邻居时,我得到了错误的结果。 这是我的清单

#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;
    }
}
正如您注意到的,A[2]、A[3]、B[2]、B[3]和B[4]是不正确的 我做错了什么。这可能是编译器中的错误吗


关于

问题在于,在一些push_back调用之后,您之前使用的指针变得无效,因为vector类需要重新分配数据。这涉及到分配一个新的内存块和移动对象


您可以通过两个步骤来解决问题,首先填充向量,然后再获取指针,或者您可以存储索引而不是指针,或者使用带有动态分配的
vector
,而不是
vector

更改向量的大小会使迭代器无效,因此,指向向量元素的指针可能在此处无效:

    VA.back().vbs.push_back(&VB.back());
    VB.back().vas.push_back(&VA.back())
如果你正在做这样的事情,重新考虑你的设计。在向量中存储指向元素的指针是一条危险的道路

其他答案中给出了一些解决方案。另一种可能的解决方案是使用
std::list
而不是
vector
,因为
列表
迭代器不会失效(只有当列表中的项被删除时,迭代器才会对删除的项失效)


另一个解决方案是调用向量的
reserve()
,并使用预期的最大项数。但是,即使是在向量的项目数超过保留数量的情况下,这也是不可靠的。最好重新考虑一下您正在做什么。

您没有指定要使用什么编译器。假设它是某个主线(GCC、Clang、MSCV),错误总是可能的,但在这样一个简单的代码中不太可能出现。
这是否可能是编译器中的错误
编译器中没有错误。请参阅下面的答案,了解问题所在。将std::vector替换为std::deque,以避免重新分配
    VA.back().vbs.push_back(&VB.back());
    VB.back().vas.push_back(&VA.back())