rust实战系列一百三十七:BTreeMap

BTreeMap<K,V>是基于B树数据结构的存储一组键值对(key-value-pair)的
容器。它跟HashMap的用途相似,但是内部存储的机制不同。B树的每个节点包含
多个连续存储的元素,以及多个子节点。
BTreeMap对key的要求是满足Ord约束,即具备“全序”特征。前文中关于Hash-
Map的示例也可以用BTreeMap重写,从中我们可以看到它的基本用法与HashMap很
相似:
use std::collections::BTreeMap;
#[derive(Ord, PartialOrd, Eq, PartialEq, Debug)]
struct Person {
first_name: String,
last_name: String,
}
impl Person {
fn new(first: &str, last: &str) -> Self {
Person {
first_name: first.to_string(),
last_name: last.to_string(),
}
}
}
fn main() {
let mut book = BTreeMap::new();
book.insert(Person::new(“John”, “Smith”), “521-8976”);
book.insert(Person::new(“Sandra”, “Dee”), “521-9655”);
book.insert(Person::new(“Ted”, “Baker”), “418-4165”);
let p = Person::new(“John”, “Smith”);
// 查找键对应的值
if let Some(phone) = book.get(&p) {
println!(“Phone number found: {}”, phone);
}
// 删除
book.remove(&p);
// 查询是否存在
println!(“Find key: {}”, book.contains_key(&p));
}
同样,BTreeMap也实现了entry API。BTreeMap也实现了迭代器,同样可以直
接遍历。但是HashMap在遍历的时候,是不保证遍历结果顺序的,而BTreeMap自动
把数据排好序了,它遍历结果一定是按固定顺序的。
BTreeMap比HashMap多的一项功能是,它不仅可以查询单个key的结果,还可
以查询一个区间的结果,示例如下:
use std::collections::BTreeMap;
fn main() {
let mut map = BTreeMap::new();
map.insert(3, “a”);
map.insert(5, “b”);
map.insert(8, “c”);
for (k, v) in map.range(2…6) {
println!(“{} : {}”, k, v);
}
}
执行结果是:
3 : a
5 : b
当然,我们还可以使用其他的Range类型,如RangeInclusive等,在此就不赘述
了。
对应的,标准库中的BTreeSet类型就不再展开讲解了,它跟BTreeMap非常类
似,主要区别在于它只有key没有value,从源码定义我们也可以看到:
struct BTreeSet {
map: BTreeMap<T, ()>,
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

断水流大撕兄

你的鼓励,就是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值