首页 文章

BGL:如何有效地存储edge_descriptors和vertex_descriptors?

提问于
浏览
2

因此,在我解决了BGL的循环依赖问题之后,我又遇到了另一个障碍 .

我目前正在使用邻接列表来建模我的图表 . 应用节点和边的捆绑属性以在图中存储一些信息 . 所以我有这样的事情:

class Node {
    int x, int y // position
};
class Edge {
    float length;
};

boost::adjacency_list<boost::listS, boost::listS, boost::directedS, Node, Edge>

当我想将快捷方式存储到我的代码中的其他位置的特定节点和边缘时(例如,对于具有多个通道的街道),会出现问题 . 我的第一种方法是在需要它们的地方保存edge_descriptors和vertex_descriptors . 但我想知道这样的描述符有多大(以字节为单位) . 也许有一个更好的解决方案,例如存储一小部分信息以获得相同的结果 .

有没有人知道用于这种类型的矢量的内存量:

std::vector<edge_descriptor> ?

我已经考虑过只存储指向edge_descriptors的指针,但我不知道是否以及如何工作 .

////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////

编辑:既然我的第一个问题得到了彻底的回答,我仍然想知道一件事 . 我想为我的图类构建一些接口 . 该接口应该从其他类中分离图类详细信息,这些类必须不了解图的细节 . 因此,其他类应该优选地将节点和边缘识别为数字 . 所以我提出了两个想法:

  • 我使用hash_map std::tr1::unordered_map<int, edge_descriptor> 能够将数字转换为描述符,然后再将其用作我的图形对象的索引 . 这可能是一步到位 - 如果有足够的节点和边缘要计算,散列值的计算可能会花费太多时间 . 这就是我有第二个想法的原因 .

  • 图形本身应在内部将这些数字转换为边和节点 . 我知道内部属性和属性映射可以用来实现我的想法 . 然后,您只需键入以下内容即可访问节点:
    boost::property_map<My_Graph, my_prop>::type index = get(my_prop(), G);

但有没有办法将这些属性映射与我的捆绑属性结合起来?

或者你有另一个我没有想到的想法,但是?

1 回答

  • 1

    顶点和边缘描述符的大小非常小 .

    顶点描述符是数字 . 边缘描述符是一个包含源和目标顶点描述符的小结构,以及一个指向附加到边描述符的内部数据的指针 .

    因此,您的问题的答案是您可以在向量中使用它们 . 它不会构成内存问题 .

相关问题