5 个版本
0.1.4 | 2022 年 3 月 22 日 |
---|---|
0.1.3 | 2022 年 3 月 22 日 |
0.1.2 | 2022 年 3 月 22 日 |
0.1.1 | 2022 年 3 月 15 日 |
0.1.0 | 2022 年 3 月 14 日 |
#2103 in 数据结构
20KB
232 行
Map-of-indexes
当你有一系列唯一但非密集的索引需要为每个索引关联一个值时,这是一个小型实用程序包。在文档中,索引被称为 key
。 不是 索引映射!
它可以被视为 BTreeMap
的一个较慢但更紧凑的版本。
示例
关于此包能力的简要示例
use map_of_indexes::{MapOfIndexes, MapOfIndexesError, KeyValue};
let v = vec![(3, 4), (1, 2), (5, 6)];
let mut map: MapOfIndexes::<(u8, u16)> = v.try_into()?;
map.push((7,8));
let push_res = map.push_checked((0,9));
assert_eq!(push_res, Err(MapOfIndexesError::SmallerKey));
let old_key_value = map.set((1,9))?;
assert_eq!(old_key_value.key(), &1);
assert_eq!(old_key_value.value(), &2);
CombinedKeyValue
是需要节省空间时的紧凑表示。
use map_of_indexes::{CombinedKeyValue};
// We have keys that take up to 40 bits, and value up to 24;
// Using (u64, u64) would have wasted 8 byte per entry.
type CombinedU64 = CombinedKeyValue<u64, 40, 24>;
CombinedU64::safety_check(); // ensure that key and value size fit on the unsigned integer.
let v = vec![CombinedU64::new(3u64, 4u32), CombinedU64::new(1u64, 2u32), CombinedU64::new(5u64, 6u32)];
let map: MapOfIndexes<_> = v.try_into()?;
let inner_raw: Vec<u64> = Vec::from_iter(map.iter().map(|x| *x.as_ref()));
assert_eq!(inner_raw, vec![2199023255553, 4398046511107, 6597069766661]);
对于更紧凑的表示,可以考虑使用 bitvec
包。
许可证: AGPL-3.0+
依赖关系
~260–710KB
~17K SLoC