如何从Rust的BinaryHeap中移除单个指定值实例?
Rust BinaryHeap:移除单个指定值实例的可行方案
std::collections::BinaryHeap没有提供直接移除单个指定值实例的API,也没有内置方法统计某个值的元素数量。
- 虽然
retain方法可以移除所有匹配目标值的元素,但无法获取移除的总数,因此没法通过“移除全部后重新添加N-1个”的方式实现只删一个的需求。 - 当前可行的解决思路是:将整个BinaryHeap的元素导出,遍历过程中跳过一个目标值,其余元素插入新的BinaryHeap。
举个例子:如果原堆包含[a, b, c, c, c, c, d, e],要移除1个c实例,就遍历所有元素,遇到第一个c时跳过,剩下的元素全部插入新堆即可。
示例代码实现:
use std::collections::BinaryHeap; fn remove_one<T: Ord + Clone>(heap: &mut BinaryHeap<T>, target: &T) { let mut removed = false; let mut new_heap = BinaryHeap::new(); while let Some(item) = heap.pop() { if !removed && &item == target { removed = true; } else { new_heap.push(item); } } *heap = new_heap; }
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

