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

时间:2010-11-25 11:44:39

标签: c++ memory-management boost-graph vertex descriptor

因此,在我解决了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的指针,但我不知道是否以及如何工作。

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

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

  1. 我使用hash_map std::tr1::unordered_map<int, edge_descriptor>能够将数字转换为描述符,然后再将这些描述符用作我的图形对象的索引。这可能是一步到位 - 也许哈希值的计算将花费太多时间 如果有足够的节点和边缘要计算。这就是为什么我有了第二个想法。
  2. 图表本身应在内部将这些数字转换为边和节点。我知道内部属性和属性映射可以用来实现我的想法。然后,您只需键入以下内容即可访问节点:
    boost::property_map<My_Graph, my_prop>::type index = get(my_prop(), G);
  3. 但是有没有办法将这些属性贴图与我的捆绑属性结合起来?

    或者你有另一个我没想过的想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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