RangeSet

Struct RangeSet 

Source
pub struct RangeSet<T, M = ()>
where T: Ord + Copy,
{ /* private fields */ }
Expand description

一个「区间集合」数据结构:维护一组有序、互不重叠的半开区间 [start, end)

  • 插入时会把重叠/相邻的区间自动合并。
  • 每个合并后的区间会保留其包含的所有原始区间及 metadata。
  • 删除一个区间时,会从集合里移除交集;必要时把已有区间拆成左右两段。
  • 删除时会同步移除完全被删除的原始区间。

约定:空区间(start >= end)会被忽略。

Implementations§

Source§

impl<T, M> RangeSet<T, M>
where T: Ord + Copy,

Source

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}
Source

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}
Source

pub fn as_slice(&self) -> Vec<Range<T>>

返回归一化后的区间切片(仅 range,已排序、已合并、互不重叠)。

Source

pub fn iter(&self) -> impl Iterator<Item = &Range<T>>

返回归一化后的区间迭代器(零拷贝)。

Source

pub fn is_empty(&self) -> bool

Source

pub fn len(&self) -> usize

Source

pub fn clear(&mut self)

Source

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}
Source

pub fn contains(&self, value: T) -> bool

查询某个值是否落在任意一个区间中。

Source

pub fn remove_range(&mut self, range: Range<T>)
where M: Clone,

删除一个区间:从集合中移除与其相交的部分。

若被删除区间位于某个已有区间内部,会导致该已有区间被拆分为两段。 同时会移除完全被删除的原始区间。

Source§

impl<T> RangeSet<T, ()>
where T: Ord + Copy,

Source

pub fn add_range(&mut self, range: Range<T>)

添加一个区间(不带 metadata)。

Source

pub fn extend<I>(&mut self, ranges: I)
where I: IntoIterator<Item = Range<T>>,

批量添加多个区间(不带 metadata)。

Trait Implementations§

Source§

impl<T, M: Clone> Clone for RangeSet<T, M>
where T: Ord + Copy + Clone,

Source§

fn clone(&self) -> RangeSet<T, M>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T, M: Debug> Debug for RangeSet<T, M>
where T: Ord + Copy + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T, M> Default for RangeSet<T, M>
where T: Ord + Copy,

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<T, M> Freeze for RangeSet<T, M>

§

impl<T, M> RefUnwindSafe for RangeSet<T, M>

§

impl<T, M> Send for RangeSet<T, M>
where T: Send, M: Send,

§

impl<T, M> Sync for RangeSet<T, M>
where T: Sync, M: Sync,

§

impl<T, M> Unpin for RangeSet<T, M>
where T: Unpin, M: Unpin,

§

impl<T, M> UnwindSafe for RangeSet<T, M>
where T: UnwindSafe, M: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.