如何在 BTreeMap/BTreeSet 中找到下一个较小的键?
How to find next smaller key in BTreeMap/BTreeSet?
如果我对b树的理解是正确的,那么在对数时间内搜索一个key应该是很容易和可能的。如果key不存在,可以return下一个更小更大的key;给定键的邻居,如果它会被插入。
这个功能已经存在了吗?
用当前的 API 执行此操作的一种可能但复杂的方法是插入密钥,然后获取该密钥的迭代器,以便我们可以在此迭代器上调用 next
。虽然,还不清楚如何获取新插入元素的迭代器(参见 this question)
为什么缺少这些方法或者我是否遗漏了什么?
您可以在返回的 Range
对象上使用 range
method 和迭代器方法:
use std::collections::BTreeMap;
let mut map = BTreeMap::new();
map.insert(2, 0);
map.insert(3, 1);
map.insert(5, 2);
map.insert(7, 3);
map.insert(11, 4);
let key = 6;
println!("maximum in map less than {}: {:?}",
key, map.range(..key).next_back().unwrap());
println!("minimum in map greater than {}: {:?}",
key, map.range(key..).next().unwrap());
next_back()
和 next()
都执行树遍历,因此它们相当有效。
如果我对b树的理解是正确的,那么在对数时间内搜索一个key应该是很容易和可能的。如果key不存在,可以return下一个更小更大的key;给定键的邻居,如果它会被插入。
这个功能已经存在了吗?
用当前的 API 执行此操作的一种可能但复杂的方法是插入密钥,然后获取该密钥的迭代器,以便我们可以在此迭代器上调用 next
。虽然,还不清楚如何获取新插入元素的迭代器(参见 this question)
为什么缺少这些方法或者我是否遗漏了什么?
您可以在返回的 Range
对象上使用 range
method 和迭代器方法:
use std::collections::BTreeMap;
let mut map = BTreeMap::new();
map.insert(2, 0);
map.insert(3, 1);
map.insert(5, 2);
map.insert(7, 3);
map.insert(11, 4);
let key = 6;
println!("maximum in map less than {}: {:?}",
key, map.range(..key).next_back().unwrap());
println!("minimum in map greater than {}: {:?}",
key, map.range(key..).next().unwrap());
next_back()
和 next()
都执行树遍历,因此它们相当有效。