pub struct RangeSet<T, const C: usize = 128>{ /* private fields */ }Expand description
一个「区间集合」数据结构:维护一组有序、互不重叠的半开区间 [start, end)。
- 插入时会把重叠/相邻的区间自动合并。
- 删除一个区间时,会从集合里移除交集;必要时把已有区间拆成左右两段。
约定:空区间(start >= end)会被忽略。
Implementations§
Source§impl<T, const C: usize> RangeSet<T, C>
impl<T, const C: usize> RangeSet<T, C>
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<i32, 16> = RangeSet::new();
5 set.add(1..5);
6 set.add(3..8);
7 set.add(10..15);
8 set.add(12..18);
9
10 println!("=== 区间合并结果 ===");
11 for (i, range) in set.iter().enumerate() {
12 println!("Element {}: [{}, {})", i, range.start, range.end);
13 }
14
15 println!("\n=== Debug 格式 ===");
16 for (i, range) in set.iter().enumerate() {
17 println!("Element {}: {:?}", i, range);
18 }
19
20 println!("\n=== 完整切片 ===");
21 println!("{:?}", set.as_slice());
22}Sourcepub fn as_slice(&self) -> &[Range<T>]
pub fn as_slice(&self) -> &[Range<T>]
返回内部区间的切片(已排序、已合并、互不重叠)。
Examples found in repository?
examples/debug_demo.rs (line 21)
3fn main() {
4 let mut set: RangeSet<i32, 16> = RangeSet::new();
5 set.add(1..5);
6 set.add(3..8);
7 set.add(10..15);
8 set.add(12..18);
9
10 println!("=== 区间合并结果 ===");
11 for (i, range) in set.iter().enumerate() {
12 println!("Element {}: [{}, {})", i, range.start, range.end);
13 }
14
15 println!("\n=== Debug 格式 ===");
16 for (i, range) in set.iter().enumerate() {
17 println!("Element {}: {:?}", i, range);
18 }
19
20 println!("\n=== 完整切片 ===");
21 println!("{:?}", set.as_slice());
22}Sourcepub fn iter(&self) -> impl Iterator<Item = &Range<T>>
pub fn iter(&self) -> impl Iterator<Item = &Range<T>>
返回区间迭代器(零拷贝)。
Examples found in repository?
examples/debug_demo.rs (line 11)
3fn main() {
4 let mut set: RangeSet<i32, 16> = RangeSet::new();
5 set.add(1..5);
6 set.add(3..8);
7 set.add(10..15);
8 set.add(12..18);
9
10 println!("=== 区间合并结果 ===");
11 for (i, range) in set.iter().enumerate() {
12 println!("Element {}: [{}, {})", i, range.start, range.end);
13 }
14
15 println!("\n=== Debug 格式 ===");
16 for (i, range) in set.iter().enumerate() {
17 println!("Element {}: {:?}", i, range);
18 }
19
20 println!("\n=== 完整切片 ===");
21 println!("{:?}", set.as_slice());
22}pub fn is_empty(&self) -> bool
pub fn len(&self) -> usize
pub fn clear(&mut self)
Sourcepub fn add(&mut self, range: Range<T>)
pub fn add(&mut self, range: Range<T>)
添加一个区间;会把与其重叠或相邻的区间合并。
Examples found in repository?
examples/debug_demo.rs (line 5)
3fn main() {
4 let mut set: RangeSet<i32, 16> = RangeSet::new();
5 set.add(1..5);
6 set.add(3..8);
7 set.add(10..15);
8 set.add(12..18);
9
10 println!("=== 区间合并结果 ===");
11 for (i, range) in set.iter().enumerate() {
12 println!("Element {}: [{}, {})", i, range.start, range.end);
13 }
14
15 println!("\n=== Debug 格式 ===");
16 for (i, range) in set.iter().enumerate() {
17 println!("Element {}: {:?}", i, range);
18 }
19
20 println!("\n=== 完整切片 ===");
21 println!("{:?}", set.as_slice());
22}Sourcepub fn remove(&mut self, range: Range<T>)
pub fn remove(&mut self, range: Range<T>)
删除一个区间:从集合中移除与其相交的部分。
若被删除区间位于某个已有区间内部,会导致该已有区间被拆分为两段。
Sourcepub fn extend<I>(&mut self, ranges: I)where
I: IntoIterator<Item = Range<T>>,
pub fn extend<I>(&mut self, ranges: I)where
I: IntoIterator<Item = Range<T>>,
批量添加多个区间。
Trait Implementations§
Auto Trait Implementations§
impl<T, const C: usize> Freeze for RangeSet<T, C>where
T: Freeze,
impl<T, const C: usize> RefUnwindSafe for RangeSet<T, C>where
T: RefUnwindSafe,
impl<T, const C: usize> Send for RangeSet<T, C>where
T: Send,
impl<T, const C: usize> Sync for RangeSet<T, C>where
T: Sync,
impl<T, const C: usize> Unpin for RangeSet<T, C>where
T: Unpin,
impl<T, const C: usize> UnwindSafe for RangeSet<T, C>where
T: 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