#hash-map #flat #multimap

mashmap

支持每个键多个条目的扁平HashMap

2个版本

0.1.1 2024年5月7日
0.1.0 2024年5月2日

数据结构 中排名第 577

Download history 252/week @ 2024-05-02 52/week @ 2024-05-09 21/week @ 2024-05-16 17/week @ 2024-05-23 4/week @ 2024-05-30 7/week @ 2024-06-06 7/week @ 2024-06-13 7/week @ 2024-06-20 16/week @ 2024-06-27 63/week @ 2024-07-04 14/week @ 2024-07-11 5/week @ 2024-07-18 12/week @ 2024-07-25 30/week @ 2024-08-01 41/week @ 2024-08-08

每月下载量 89
2 个crate中使用 (通过 edges)

MIT 许可证

17KB
296

MashMap

crates.io docs

支持每个键多个条目的扁平HashMap。

这是对Rust标准 HashMap (使用hashbrown's RawTable) 的改编,以支持具有相同键的多个条目。虽然常见的做法是使用 HashMap<K, Vec<V>> 来存储与键对应的条目,但 MashMap 保持扁平布局,并使用探测来选择槽位,在同一个表中存储所有条目。这种方法避免了由向量指针引起的内存间接引用,并且由于避免了为每个键存储指针 + 长度 + 容量,因此减少了内存开销。

示例用法

use mashmap::MashMap;

let mut map = MashMap::<usize, usize>::new();
map.insert(1, 10);
map.insert(1, 11);
map.insert(1, 12);
map.insert(2, 20);
map.insert(2, 21);

// iterate over the values with key `1` with mutable references and increment them
for val in map.get_mut_iter(&1) {
    *val += 1;
}

// collect the values with keys `1` and `2`
// note that the order may differ from the insertion order
let mut values_1: Vec<_> = map.get_iter(&1).copied().collect();
let mut values_2: Vec<_> = map.get_iter(&2).copied().collect();
values_1.sort_unstable();
values_2.sort_unstable();

assert_eq!(values_1, vec![11, 12, 13]);
assert_eq!(values_2, vec![20, 21]);

致谢

这个crate受到了flat-multimap crate的启发,该crate不再有公共仓库。

依赖关系

~2MB
~25K SLoC