1 个不稳定发布
0.1.0 | 2021 年 2 月 11 日 |
---|
1309 在 数据结构 中
每月 42 次下载
43KB
725 行
索引映射
具有自动生成的 usize
作为键的映射。它支持标准库中大多数存在的 方法,如 HashMap
。
如果您需要一个具有用户定义键的泛型键值对,则这不是您需要的包。它仅用于需要自动生成键的事物。
特性
- 自动生成(并回收)唯一的索引作为键,
- 与
#[no_std]
兼容,但需要分配器。 - 在插入第一个值之前不进行分配。
- 值存储在连续的内存位置中。
- 0 个不安全块
性能
由于其简单性,它比 HashMap
表现更好。
名称 | IndexMap ns/iter | HashMap ns/iter | 差异 ns/iter | 差异百分比 | 加速 |
---|---|---|---|---|---|
插入 | 40,057 | 75,381 | -35,324 | -46.86% | 1.88x |
增长插入 | 12,553 | 100,530 | -87,977 | -87.51% | 8.01x |
插入/擦除 | 9,572 | 12,370 | -2,798 | -22.62% | 1.29x |
查找 | 1,491 | 24,253 | -22,762 | -93.85% | 16.27x |
查找失败 | 1.289 | 2.092 | -0.8 | -38.38% | 1.62x |
迭代基准 | 1,812 | 1,888 | -76 | -4.03% | 1.04x |
克隆小型 | 120.30 | 163.70 | -43.4 | -26.51% | 1.36x |
克隆大型 | 9,635 | 13,041 | -34,06 | -26.12% | 1.35x |
此处执行的基准与 hashbrown 仓库中存在的基准相同:bench.rs
用法
任何需要与某些唯一生成的 id 相关联的事物都是此库的完美用例。
例如,维护进程表。
use index_map::IndexMap;
let mut process_table = IndexMap::new();
// Create some processes
// Unlike HashMap, insert only takes a value, and returns the key.
let vim = process_table.insert("vim".to_string());
// ^^^----------------------------------------------------------.
let cargo = process_table.insert("cargo".to_string()); // |
// ^^^^^--------------------------------------------------------.
let rls = process_table.insert("rust-analyser".to_string()); // |
// ^^^----------------------------------------------------------|
// |
// Unique numbers representing each process <------------------'
// Check for a specific one.
if !process_table.contains_key(6) {
println!("Invalid PID 6}");
}
// cargo finished running, remove it
process_table.remove(cargo);
// Look up the values associated with some keys.
let to_find = [2, 4];
for &pid in &to_find {
match process_table.get(pid) {
Some(process) => println!("{}: {}", pid, process),
None => println!("{} not found", pid)
}
}
// Look up the value for a key (will panic if the key is not found).
println!("PID 0 process name: {}", process_table[0]);
// Iterate over everything.
for (pid, process) in &process_table {
println!("{}: \"{}\"", pid, process);
}
方法排除
-
nightly 仅/不稳定
-
基于哈希器的函数 - 内部结构基于
Vec
,因此不需要哈希。 -
entry()
- 尽管所有针对OccupiedEntry
的方法都是可行的,但从本质上讲,键是自动生成的,因此基于VacantEntry
的方法是不可能的。 -
Extend
&FromIterator
- 由于上述原因,它不能像HashMap
那样处理键值对,也不能返回插入值的键。
贡献
如果您发现任何错误或问题,或者您希望添加一些功能,请随意打开一个 问题 或一个 pull request。