1 个不稳定发布

0.1.0 2021 年 2 月 11 日

1309数据结构

每月 42 次下载

MIT 许可证

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

无运行时依赖