【问题标题】:How to get the OutEdgeList inside a BGL graph如何在 BGL 图中获取 OutEdgeList
【发布时间】:2017-05-08 15:31:48
【问题描述】:

我使用由 boost 图形库制作的图形,并希望访问 OutEdgeList 以获取/设置一些内部信息(用于构建 OutEdgeList 的向量的保留大小)。

我广泛搜索了文档,但没有找到返回指向 OutEdgeList 的引用或指针的函数/成员。

我的问题是,是否有办法获取图表 OutEdgeList,或者 boost 是否“保护”用户不直接弄乱其内部结构。

another question 中,我发现了一个示例,您可以使用graph.m_edges 直接访问EdgeList,也可以将其用作向量来执行graph.m_edges.reserve(115960001),因此我希望也应该有一种访问OutEdgeList 的方法也是。

任何帮助表示赞赏!

【问题讨论】:

  • 所以如果正确理解返回一对开始-结束迭代器的'edges'函数不足以满足你的需求?
  • 你是对的 :) 因为在我看来,拥有边缘迭代器并不能让我操纵它正在迭代的向量,而这是我想要操纵的成员。
  • 我不能确定,但​​逻辑是他们试图抽象底层数据结构(它也可能是一个 std::list 或一个 std::set 存储边缘),在公共接口中放置一个允许访问 std::vector 的方法将违反此规定。
  • 但它也适用于 EdgeProperties。它们也作为模板参数传递,我可以得到其背后的具体数据结构。模板给出的成员并返回成员没有冲突...

标签: c++ boost boost-graph


【解决方案1】:

获取 OutEdgeList 的正确方法是遍历所有 m_vertices 并访问它们的 m_out_edges 属性。

VertexIterator vi, vi_end;
for (boost::tie(vi, vi_end) = vertices(graph); vi != vi_end; ++vi){
     graph.m_vertices[*vi].m_out_edges.reserve(6);
}

通过为每个顶点保留适当数量的边,我将内存使用量从 12GB 减少到 10.5GB。

我花了很长时间才找到成员,因为我希望他们在 boost/graph/adjacency_list.hpp,但他们在 boost/graph/detail/adjacency_list.hpp

【讨论】:

  • 原则上是+1,但要注意您使用的是未记录的实现细节,因此基本上需要您自担风险。 “找到成员花了很长时间”,因为它们不是公共接口的一部分:您可能会在不知不觉中破坏不变量。
  • 毫无疑问,是的,当我这么说时,我可能是短板的,但是在向量中保留足够的空间应该不会有进一步的副作用。但是是的,没有记录的路径是安全问题上灰色区域的明显标志......
  • 我同意你的观点,reserve() 是安全的,因为它对不变量没有影响(adjacency_list 没有记录性能/分配效率保证)。我认为总的来说值得指出。不是每个人都知道这些事情。答案很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多