5 个版本
0.2.1 | 2021年8月29日 |
---|---|
0.2.0 | 2021年8月7日 |
0.1.2 | 2021年8月7日 |
0.1.1 | 2021年8月7日 |
0.1.0 | 2021年8月7日 |
#562 in 科学
8KB
73 行
smol-graph
一个简单且直截了当的 Rust 图实现。
它使用 Uuid
作为其索引(在 newtypes 内部)。这意味着可以生成一个已存在的 id,但这种情况的可能性几乎为零。
此软件包还提供了一个 prelude
,导出此软件包中使用的所有类型:Graph
、NodeIndex
和 EdgeIndex
。
示例
用法:首先将其添加到您的 Cargo.toml 中,然后在项目中使用它。
// Import the few types this library exports.
use smol_graph::prelude::*;
// Or do it explicitely.
use smol_graph::{
Graph, Edge, EdgeIndex, NodeIndex,
};
创建一个新的图
use smol_graph::Graph;
// Convience function:
let graph: Graph<(), ()> = Graph::new();
// Or alternately, explicit field filling.
// This could be used for with capacity or prefilled maps, for example.
use std::collections::HashMap;
let graph: Graph<(), ()> = Graph {
nodes: HashMap::new(),
edges: HashMap::new(),
};
插入节点和边
use smol_graph::{Graph, Edge};
let mut graph: Graph<i32, String> = Graph::new();
// Insert nodes and get their indices.
let one = graph.node(1);
let two = graph.node(2);
// or do it with field access
let three = {
use smol_graph::NodeIndex;
let idx = NodeIndex::new();
graph.nodes.insert(idx, 3);
idx
};
// And then for edges:
let a = graph.edge(Edge::new((one, two), String::from("a")));
// Or with field access:
let b = {
use smol_graph::EdgeIndex;
let idx = EdgeIndex::new();
let edge = Edge {
nodes: (two, three),
data: String::from("b"),
};
graph.edges.insert(idx, edge);
idx
};
删除节点或边
use smol_graph::{Graph, Edge};
let mut graph = Graph::new();
let a = graph.node(5);
let b = graph.node(6);
let edge = graph.edge(Edge::new((a, b), ()));
// Watch out, the edge still points to the node that doesn't exist.
graph.r_node(a).unwrap();
graph.r_node(b).unwrap();
// And then remove the edge.
graph.r_edge(edge).unwrap();
注意
-
它使用 Uuid 作为索引。这意味着,尽管几乎不可能,但可能会生成重复的索引。有关更多信息,请参阅 https://en.wikipedia.org/wiki/Universally_unique_identifier。
-
该图由 std hashmap 支持,用于节点和边。虽然这可能在所有情况下都不是最好的,但它肯定是最简单的一种。
-
它不会检查指向有效节点的边。虽然可以实现这一点,但此库的目标是拥有一个小型且易于使用的图类型,检查节点需要设计决策,这留给了用户。
依赖项
~285–445KB