在有向邻接列表图中存储不同大小的边

时间:2015-10-23 16:48:59

标签: c++ memory graph storage

我们说我有以下设置:

class Vertex;

class Edge {
    Vertex *to;
};

class Teleport : public Edge {
    int teleportCost;
};

class Walk : public Edge {
    double distance;
};

class Vertex {
    vector<Edge> adjacencies; // can only store Edge and not Walk, Teleport etc!
};

问题当然是Vertex可以有许多不同类型的邻接,每个邻接都有不同的字节大小。那么,存储边缘的最佳方法是什么?我的图表永远不会删除顶点或边缘;一旦它完全建成,它将保留在内存中,直到它全部被摧毁。也许这将允许全球&#34;在大内存池中存储字节或足够大vector,然后每个Vertex都有vector<void*>vector<Edge*>或指向内存缓冲区的内容。但是,我不确定如何做到这一点。任何人都可以帮助提供一些关于什么可能最适合在我的场景中用作存储的指导吗?

所有Edge都将以多态方式使用,因此我永远不需要转换为Teleport等等。

1 个答案:

答案 0 :(得分:1)

当一个类型要被子类型化时,这种类型的对象的向量或数组几乎总是错误的。您需要存储一个向量或指针数组。

而不是:

vector<Edge> adjacencies;

使用

vector<std::share_ptr<Edge>> adjacencies;