5 个版本
0.0.5 | 2023 年 1 月 12 日 |
---|---|
0.0.4 | 2022 年 1 月 9 日 |
0.0.3 | 2022 年 1 月 5 日 |
0.0.2 | 2021 年 12 月 24 日 |
0.0.1 | 2021 年 12 月 22 日 |
#1315 在 数据结构
1,056 每月下载量
用于 2 crates
53KB
1K SLoC
key-node-list
存储键-节点对的循环链表。
KeyNodeList
是一个循环链表,它使用哈希表来维护键和节点之间的对应关系,并在节点本身中记录当前节点的上一个键和下一个键。在此过程中没有指针操作,因此 key_node_list
完全在安全 Rust 中实现。
您可以在 KeyNodeList
中完成键查找、键-节点对更新、键-节点对删除等操作,这些操作的时间复杂度为 O(1)。您还可以使用基于游标的接口来遍历或编辑链表。
用法
key_node_list
可在 crates.io 上找到:
cargo add key-node-list
示例
use key_node_list::KeyValueList;
// construct key-value list from tuple array
let mut list = KeyValueList::from([(1, "Reimu"), (2, "Marisa")]);
// or pushing other key-value pairs to the front/back of list
list.push_front(0, "Alice").unwrap();
list.push_back(3, "Patchouli").unwrap();
// query nodes by key
assert_eq!(list[&1].value(), &"Reimu");
assert_eq!(list[&0].value(), &"Alice");
// also you can update nodes by key
*list.node_mut(&3).unwrap().value_mut() = "Youmu";
*list.front_node_mut().unwrap().value_mut() = "Mokou";
assert_eq!(list[&3].value(), &"Youmu");
assert_eq!(list[&0].value(), &"Mokou");
assert_eq!(list.front_node().unwrap().value(), &"Mokou");
// remove some key-node pairs
assert!(list.pop_front().is_some());
assert!(list.remove(&2).is_some());
// all key-node pairs are in order
list.push_back(5, "Yuyuko");
let vec: Vec<_> = list.into_iter().map(|(k, n)| (k, n.into_value())).collect();
assert_eq!(vec, [(1, "Reimu"), (3, "Youmu"), (5, "Yuyuko")]);
有关更多详细信息,请访问 key_node_list
在 docs.rs。
变更日志
查看 CHANGELOG.md。
许可证
版权所有 (C) 2010-2023 MaxXing。许可证 GPLv3。