使用unordered_map实现图表表示的邻接列表

时间:2014-05-01 12:22:11

标签: c++ c++11 unordered-map adjacency-list

我想使用unordered_map为图形实现邻接列表。选择unordered_map,因为它可以给我O(1)时间来访问给定顶点的相邻顶点。所以我的想法是将unordered_map定义如下:

using namespace std;

class node {};
class edge {};  
typedef vector<edge*> edges_t;
typedef unordered_map<node*, edges_t*> graph_t;

我使用类节点的指针作为unordered_map的键,因为直接使用节点对象需要自定义的std :: hash实现。使用指针的主要问题是内存管理。我需要明确释放分配的内存。

这里可以使用unique_ptr来缓解内存管理吗?还是建议任何更好的解决方案?

谢谢!

2 个答案:

答案 0 :(得分:1)

所有权政策确实是一个问题,你有几个可能性:

  • 如果有明确的所有者,std::unique_ptr是最佳选择(请参阅this example
  • 如果有多个可能的所有者,您可以打破对称并引入一个或推迟std::shared_ptr(谨防周期)

打破对称可以像引入一个包含节点的std::deque<node>一样简单,并在该容器内引用指针。同样,std::deque<edge>可以解决边缘的所有权问题。

答案 1 :(得分:0)

在最近的一个程序中,在我的Graph类中,我创建了一个名为Map的新数据类型,我定义为:

typedef unordered_map,VertexHash,VertexEquals&gt;图

其中Vertex对象是节点;边缘对象是原点顶点,目标顶点和双倍距离; VertexHash是一个具有重载()到散列顶点对象的类或结构;和VertexEquals是一个类或stuct,它决定了两个Verrte。对象是相等的使用重载==。每个Graph对象都有一个向量,它包含一个Vertex对象列表和一个包含图形数据的Map变量。