pub struct RangeSet<T, M = ()>{ /* private fields */ }Expand description
一个「区间集合」数据结构:维护一组有序、互不重叠的半开区间 [start, end)。
- 插入时会把重叠/相邻的区间自动合并。
- 每个合并后的区间会保留其包含的所有原始区间及 metadata。
- 删除一个区间时,会从集合里移除交集;必要时把已有区间拆成左右两段。
- 删除时会同步移除完全被删除的原始区间。
约定:空区间(start >= end)会被忽略。
Implementations§
Source§impl<T, M> RangeSet<T, M>
impl<T, M> RangeSet<T, M>
Sourcepub fn new() -> Self
pub fn new() -> Self
创建空集合。
Examples found in repository?
examples/debug_demo.rs (line 4)
3fn main() {
4 let mut set = RangeSet::new();
5 set.add(1..5, "first");
6 set.add(3..8, "second");
7 set.add(10..15, "third");
8 set.add(12..18, "fourth");
9
10 println!("=== Display Output (只显示合并范围) ===");
11 for (i, element) in set.elements().iter().enumerate() {
12 println!("Element {}: {}", i, element);
13 }
14
15 println!("\n=== 十六进制格式 ({{:#x}}) ===");
16 for (i, element) in set.elements().iter().enumerate() {
17 println!("Element {}: {:#x}", i, element);
18 }
19
20 println!("\n=== 二进制格式 ({{:#b}}) ===");
21 for (i, element) in set.elements().iter().enumerate() {
22 println!("Element {}: {:#b}", i, element);
23 }
24
25 println!("\n=== 八进制格式 ({{:#o}}) ===");
26 for (i, element) in set.elements().iter().enumerate() {
27 println!("Element {}: {:#o}", i, element);
28 }
29
30 println!("\n=== Debug Output (详细信息) ===\n");
31 for (i, element) in set.elements().iter().enumerate() {
32 println!("Element {}:", i);
33 println!("{:#?}\n", element);
34 }
35}Sourcepub fn elements(&self) -> &[MergedRange<T, M>]
pub fn elements(&self) -> &[MergedRange<T, M>]
返回内部元素的切片(每个元素包含合并后的 range 和原始列表)。
Examples found in repository?
examples/debug_demo.rs (line 11)
3fn main() {
4 let mut set = RangeSet::new();
5 set.add(1..5, "first");
6 set.add(3..8, "second");
7 set.add(10..15, "third");
8 set.add(12..18, "fourth");
9
10 println!("=== Display Output (只显示合并范围) ===");
11 for (i, element) in set.elements().iter().enumerate() {
12 println!("Element {}: {}", i, element);
13 }
14
15 println!("\n=== 十六进制格式 ({{:#x}}) ===");
16 for (i, element) in set.elements().iter().enumerate() {
17 println!("Element {}: {:#x}", i, element);
18 }
19
20 println!("\n=== 二进制格式 ({{:#b}}) ===");
21 for (i, element) in set.elements().iter().enumerate() {
22 println!("Element {}: {:#b}", i, element);
23 }
24
25 println!("\n=== 八进制格式 ({{:#o}}) ===");
26 for (i, element) in set.elements().iter().enumerate() {
27 println!("Element {}: {:#o}", i, element);
28 }
29
30 println!("\n=== Debug Output (详细信息) ===\n");
31 for (i, element) in set.elements().iter().enumerate() {
32 println!("Element {}:", i);
33 println!("{:#?}\n", element);
34 }
35}pub fn is_empty(&self) -> bool
pub fn len(&self) -> usize
pub fn clear(&mut self)
Sourcepub fn add(&mut self, range: Range<T>, meta: M)where
M: PartialEq,
pub fn add(&mut self, range: Range<T>, meta: M)where
M: PartialEq,
添加一个区间及其 metadata;会把与其重叠或相邻的区间合并。
Examples found in repository?
examples/debug_demo.rs (line 5)
3fn main() {
4 let mut set = RangeSet::new();
5 set.add(1..5, "first");
6 set.add(3..8, "second");
7 set.add(10..15, "third");
8 set.add(12..18, "fourth");
9
10 println!("=== Display Output (只显示合并范围) ===");
11 for (i, element) in set.elements().iter().enumerate() {
12 println!("Element {}: {}", i, element);
13 }
14
15 println!("\n=== 十六进制格式 ({{:#x}}) ===");
16 for (i, element) in set.elements().iter().enumerate() {
17 println!("Element {}: {:#x}", i, element);
18 }
19
20 println!("\n=== 二进制格式 ({{:#b}}) ===");
21 for (i, element) in set.elements().iter().enumerate() {
22 println!("Element {}: {:#b}", i, element);
23 }
24
25 println!("\n=== 八进制格式 ({{:#o}}) ===");
26 for (i, element) in set.elements().iter().enumerate() {
27 println!("Element {}: {:#o}", i, element);
28 }
29
30 println!("\n=== Debug Output (详细信息) ===\n");
31 for (i, element) in set.elements().iter().enumerate() {
32 println!("Element {}:", i);
33 println!("{:#?}\n", element);
34 }
35}Sourcepub fn remove_range(&mut self, range: Range<T>)where
M: Clone,
pub fn remove_range(&mut self, range: Range<T>)where
M: Clone,
删除一个区间:从集合中移除与其相交的部分。
若被删除区间位于某个已有区间内部,会导致该已有区间被拆分为两段。 同时会移除完全被删除的原始区间。
Trait Implementations§
Auto Trait Implementations§
impl<T, M> Freeze for RangeSet<T, M>
impl<T, M> RefUnwindSafe for RangeSet<T, M>where
T: RefUnwindSafe,
M: RefUnwindSafe,
impl<T, M> Send for RangeSet<T, M>
impl<T, M> Sync for RangeSet<T, M>
impl<T, M> Unpin for RangeSet<T, M>
impl<T, M> UnwindSafe for RangeSet<T, M>where
T: UnwindSafe,
M: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more