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

using unordered_map to implement adjacency list for graph representation

本文关键字:列表 表示 图形 unordered map 实现 使用      更新时间:2023-10-16

我想使用 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键,因为直接使用 node 对象需要自定义的 std::hash 实现。使用指针的主要问题是内存管理。我需要显式释放分配的内存。

unique_ptr可以在这里使用来简化内存管理吗? 或者任何更好的解决方案来建议?

谢谢!

所有权策略确实是一个问题,您有几种可能性:

  • 如果存在明确的所有者,则std::unique_ptr是最佳选择(请参阅此示例(
  • 如果有多个可能的所有者,您可以打破对称性并引入一个,也可以推迟到std::shared_ptr(当心循环(

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

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

typedef unordered_map, VertexHash, VertexEquals> Map

其中顶点对象是节点;边对象是原点顶点、目标顶点和双倍距离;顶点哈希是一个类或结构,带有重载 ( ( 来散列顶点对象;和 VertexEquals 是一个类或结构,它确定是否两个 Verrte。对象与重载 == 相同。每个 Graph 对象都有一个包含顶点对象列表的向量和一个保存图形数据的 Map 变量。