#collection #binary-heap #b-tree #run-time #string-key #depend

无std copse

标准库中的BTreeMap、BTreeSet和BinaryHeap集合的直接端口,但根据指定的总序进行排序,而不是根据Ord特性

6个版本 (3个破坏性更新)

0.4.1 2023年2月12日
0.4.0 2023年1月20日
0.3.0 2023年1月19日
0.2.0 2023年1月1日
0.1.1 2022年12月31日

#617 in 数据结构

MIT/Apache

550KB
10K SLoC

直接端口标准库的BTreeMapBTreeSetBinaryHeap集合,但它们根据指定的TotalOrder进行排序,而不是依赖于Ord特性。

这在TotalOrder依赖于运行时状态,因此不能为任何类型提供Ord实现时非常有用。

查找键

在标准库的集合中,某些查找可以使用类型为&Q的键执行,其中集合的存储键类型K实现了Borrow<Q>;例如,可以使用&str键对存储String键的集合进行查找。这是可能的,因为String: Borrow<str>Borrow特性规定,借用值必须保持Ord顺序。

然而,copse的集合不使用Ord特质;相反,查找只能使用在集合创建时提供的类型OTotalOrder来执行。这个总排序只能比较其关联类型OrderedType的值,因此用于查找的键必须实现SortableBy<O>,以便可以提取排序键。

示例

use copse::{BTreeSet, SortableBy, TotalOrder};
use std::cmp::Ordering;

// define a total order
struct OrderByNthByte {
    n: usize, // runtime state
}

impl TotalOrder for OrderByNthByte {
    type OrderedType = [u8];
    fn cmp(&self, this: &[u8], that: &[u8]) -> Ordering {
        this.get(self.n).cmp(&that.get(self.n))
    }
}

// define lookup key types for collections sorted by our total order
impl SortableBy<OrderByNthByte> for [u8] {
    fn sort_key(&self) -> &[u8] { self }
}
impl SortableBy<OrderByNthByte> for str {
    fn sort_key(&self) -> &[u8] { self.as_bytes() }
}
impl SortableBy<OrderByNthByte> for String {
    fn sort_key(&self) -> &[u8] { SortableBy::<OrderByNthByte>::sort_key(self.as_str()) }
}

// create a collection using our total order
let mut set = BTreeSet::new(OrderByNthByte { n: 9 });
assert!(set.insert("abcdefghijklm".to_string()));
assert!(!set.insert("xxxxxxxxxjxx".to_string()));
assert!(set.contains("jjjjjjjjjj"));

集合类型参数

除了标准库集合中熟悉的类型参数外,copse的集合还通过TotalOrder的类型进行参数化。如果总排序没有明确命名,它默认为存储键的OrdTotalOrder,这会产生类似于标准库集合的行为(即按Ord特质排序);显式使用这些项表明您应该(并且很可能应该)放弃使用copse而改用标准库。

包功能标志

此包定义了多个功能标志,默认都不启用

  • std功能提供了OrdStoredKey实现,这些实现适用于标准库中不存在的某些类型,即OsStringOsStrPathBufPath

  • unstable集中的每个功能都与标准库B-Tree和BinaryHeap集合实现中的同名不稳定功能相对应,所有这些功能都启用了完全包含在库中的API,因此不需要nightly工具链;

  • btreemap_alloc功能与标准库B-Tree集合实现中的同名不稳定功能相对应(即启用它们的new_in关联函数);然而(截至rustc v1.66.1),此功能需要allocator_api不稳定编译器功能,该功能仅在nightly工具链中可用;

  • 所有其他功能(合并到nightly集中)不会影响此包提供的API,而是将实现切换到使用标准库实现中使用的那些功能——这些功能对库用户可能用处不大或兴趣不大,但仍然包括在内,以便与标准库同步。

依赖