我想使用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来缓解内存管理吗?还是建议任何更好的解决方案?
谢谢!
答案 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变量。