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 数据结构
550KB
10K SLoC
直接端口标准库的BTreeMap
、BTreeSet
和BinaryHeap
集合,但它们根据指定的TotalOrder
进行排序,而不是依赖于Ord
特性。
这在TotalOrder
依赖于运行时状态,因此不能为任何类型提供Ord
实现时非常有用。
查找键
在标准库的集合中,某些查找可以使用类型为&Q
的键执行,其中集合的存储键类型K
实现了Borrow<Q>
;例如,可以使用&str
键对存储String
键的集合进行查找。这是可能的,因为String: Borrow<str>
和Borrow
特性规定,借用值必须保持Ord
顺序。
然而,copse的集合不使用Ord
特质;相反,查找只能使用在集合创建时提供的类型O
的TotalOrder
来执行。这个总排序只能比较其关联类型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
实现,这些实现适用于标准库中不存在的某些类型,即OsString
、OsStr
、PathBuf
和Path
; -
unstable
集中的每个功能都与标准库B-Tree和BinaryHeap集合实现中的同名不稳定功能相对应,所有这些功能都启用了完全包含在库中的API,因此不需要nightly工具链; -
btreemap_alloc
功能与标准库B-Tree集合实现中的同名不稳定功能相对应(即启用它们的new_in
关联函数);然而(截至rustc v1.66.1),此功能需要allocator_api
不稳定编译器功能,该功能仅在nightly工具链中可用; -
所有其他功能(合并到
nightly
集中)不会影响此包提供的API,而是将实现切换到使用标准库实现中使用的那些功能——这些功能对库用户可能用处不大或兴趣不大,但仍然包括在内,以便与标准库同步。