11 个不稳定版本 (5 个破坏性更新)

0.7.2 2023年10月5日
0.7.0 2023年8月16日
0.6.0 2023年7月2日
0.5.0 2022年11月7日
0.2.5 2022年3月30日

#132 in 数据结构

Download history 217/week @ 2024-04-22 217/week @ 2024-04-29 495/week @ 2024-05-06 406/week @ 2024-05-13 434/week @ 2024-05-20 448/week @ 2024-05-27 433/week @ 2024-06-03 384/week @ 2024-06-10 400/week @ 2024-06-17 526/week @ 2024-06-24 262/week @ 2024-07-01 453/week @ 2024-07-08 452/week @ 2024-07-15 520/week @ 2024-07-22 615/week @ 2024-07-29 525/week @ 2024-08-05

每月2,131次下载
用于 71 个crate(直接使用4个)

MIT/Apache

110KB
3K SLoC

B-树范围映射

CI Crate informations License Documentation

范围映射是一种将键聚合到键的范围中以便于存储的映射。每次需要在映射或集中存储大量数字键的项时,都应该使用范围映射(或范围集)。

这个库基于 btree-slab 的 B-树提供了一个范围映射实现。它定义了三种基本类型 RangeSet<T>RangeMap<K, V>RangeMultiMap<K, S>

使用方法

RangeSet<T>RangeMap<K, V> 的行为与标准的 BTreeSet<T>BTreeMap<K, V> 类型类似。然而,除了 PartialOrd,键类型还必须实现定义如何将键合并到范围的 Measure 特性。这个特性默认为 char、整数类型和浮点类型实现。

use btree_range_map::RangeMap;

let mut range_map: RangeMap<i32, bool> = RangeMap::new();
range_map.insert(00..=05, true);
range_map.insert(4, false);
assert_eq!(range_map.range_count(), 3);
assert_eq!(range_map.get(03), Some(&true));
assert_eq!(range_map.get(04), Some(&false));
assert_eq!(range_map.get(05), Some(&true));

此库支持包含和排除边界

range_map.insert(..1, true);
range_map.insert(..=1, true);
range_map.insert(2, true);
range_map.insert(3..5, true);
range_map.insert(5..=7, true);
range_map.insert(7.., true);
assert_eq!(range_map.range_count(), 1);

它还支持具有排除起始边界的非标准范围

use btree_range_map::{
  RangeFromExcluded,
  RangeFromExcludedTo,
  RangeFromExcludedToIncluded
};

// same as       `4..`
range_map.insert(RangeFromExcluded::new(3), true);

// same as       `3`
range_map.insert(RangeFromExcludedTo::new(2, 4), true);

// same as       `1..=2`
range_map.insert(RangeFromExcludedToIncluded::new(0, 2), true);

assert_eq!(range_map.range_count(), 1);

浮点数

浮点数 f32f64 被处理得与预期一样。

use btree_range_map::{RangeMap, RangeFromExcluded};
let mut range_map: RangeMap<f32, bool> = RangeMap::new();

// sets all `f32` below zero to `false`.
range_map.insert(..0.0, false);

// sets all `f32` above zero to `true`.
range_map.insert(RangeFromExcluded::new(0.0), true);

assert_eq!(range_map.range_count(), 2);
assert_eq!(range_map.get(0.0), None); // only `0.0` is unmapped.

许可证

在以下任一许可证下授权

由你选择。

贡献

除非你明确声明,否则根据Apache-2.0许可证定义的,任何有意提交以包含在作品中的贡献,将按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~360–600KB
~14K SLoC