【发布时间】:2015-12-31 00:43:05
【问题描述】:
我想从BTreeMap 中删除通过迭代找到的项目。
由于迭代时无法删除项目,我将要删除的项目放入向量中。主要问题是不能使用 references 的向量,而只能使用值的向量。然后必须克隆必须删除条目的所有键(假设键实现了Clone 特征)。
例如,这个简短的示例无法编译:
use std::collections::BTreeMap;
pub fn clean() {
let mut map = BTreeMap::<String, i32>::new();
let mut to_delete = Vec::new();
{
for (k, v) in map.iter() {
if *v > 10 {
to_delete.push(k);
}
}
}
for k in to_delete.drain(..) {
map.remove(k);
}
}
fn main() {}
编译时出现如下错误:
error[E0502]: cannot borrow `map` as mutable because it is also borrowed as immutable
--> src/main.rs:17:9
|
9 | for (k, v) in map.iter() {
| --- immutable borrow occurs here
...
17 | map.remove(k);
| ^^^ mutable borrow occurs here
18 | }
19 | }
| - immutable borrow ends here
将to_delete.push(k) 更改为to_delete.push(k.clone()) 可使此sn-p 正确编译,但如果必须克隆每个要删除的键,则代价非常高。
有没有更好的解决方案?
【问题讨论】:
-
我希望最终,
BTreeMap能够获得像fn drain(&mut self, Range<K>)这样的方法。相关的是this proto RFC,但也请查看this one 和this one。 -
@Shepmaster -- 当然,这里的问题不是 Range
,而是 Range -
@Jsor 啊,我错过了。我觉得这是一个不太可能的情况,所以它确实是一个棘手的情况!
-
这里需要的是
drain的一个版本,它带有谓词,它确实是一个值得添加的东西。
标签: rust