14 个版本 (8 个破坏性版本)
0.10.1 | 2024 年 3 月 26 日 |
---|---|
0.9.0 | 2024 年 2 月 27 日 |
0.6.1 | 2023 年 12 月 29 日 |
0.4.1 | 2023 年 9 月 4 日 |
0.3.1 | 2023 年 2 月 14 日 |
#595 in 数据结构
185KB
3.5K SLoC
mapgraph
一个强大的针对有向邻接表图的库。
图是一种复杂的数据结构,其中节点之间的关系可能经常是循环的,这与 Rust 的类型系统不太兼容。处理这个问题的典型方法是用节点和边的索引(有时称为 ID 或键)来引用图中的节点和边,这些索引被映射到实际的节点、边及其权重,而不是使用引用或指针。既然我们无论如何都要映射索引,为什么不使我们所使用的映射泛型化并允许自定义索引呢?
mapgraph
提供了一个基于两个映射的泛型 Graph
类型:一个用于节点,一个用于边。通过使用 map
子模块丰富的特质系统,Graph
类型可以从其基础映射中借用一些能力。例如,使用 HashMap
作为 Graph
的节点映射使其接受外部节点索引,从而有效地使图成为其自身节点的索引。
use mapgraph::aliases::{SlotMapGraph, HashSlotMapGraph};
// Using a graph with a SlotMap backing its nodes. The node's index is produced internally.
let mut first_graph = SlotMapGraph::<String, ()>::default();
let node_index = first_graph.add_node("foo".to_string());
assert_eq!(first_graph.node_weight(node_index).unwrap(), "foo");
// Using a graph with a HashMap backing its nodes. The node's index is supplied externally.
let mut second_graph = HashSlotMapGraph::<&str, (), &str>::default();
second_graph.try_add_node_at_index("foo", "bar")?;
assert_eq!(second_graph.node_weight("foo").unwrap(), &"bar");
有关更多信息,请参阅该软件包的文档。
许可证
根据以下任一许可证许可
- Apache 许可证版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
欢迎贡献,应作为合并请求提交到此存储库。
除非你明确声明,否则根据 Apache-2.0 许可证定义,你提交的任何有意包含在工作中的贡献,都应如上所述双重许可,不附加任何额外的条款或条件。
依赖项
~0.3–0.9MB
~16K SLoC