两个类具有指向每个类的指针

时间:2014-12-17 20:11:15

标签: c++ pointers vector

您好我想制作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]不正确 我做错了什么。这可能是编译器中的错误

问候

2 个答案:

答案 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()。但是,如果向量的项目数超过保留金额,即使这样也是不稳定的。最好重新考虑你正在做的事情。