【发布时间】:2015-09-03 23:24:26
【问题描述】:
我想从Vec 中删除一些元素,但vec.iter().filter().collect() 使用借来的项目创建了一个新向量。
我想在不分配额外内存的情况下改变原始 Vec(并保留已删除元素的内存作为向量的额外容量)。
【问题讨论】:
我想从Vec 中删除一些元素,但vec.iter().filter().collect() 使用借来的项目创建了一个新向量。
我想在不分配额外内存的情况下改变原始 Vec(并保留已删除元素的内存作为向量的额外容量)。
【问题讨论】:
如果要移除元素,可以使用retain(),如果闭包返回false,它会从向量中移除元素:
let mut vec = vec![1, 2, 3, 4];
vec.retain(|&x| x % 2 == 0);
assert_eq!(vec, [2, 4]);
如果你想修改元素,你必须在for x in vec.iter_mut()中进行。
【讨论】:
如果你真的想在过滤向量的同时改变向量的元素,你可以使用夜间专用方法Vec::drain_filter,这是一个非常灵活的工具:
#![feature(drain_filter)]
fn main() {
let mut vec = vec![1, 2, 3, 4];
vec.drain_filter(|x| {
if *x % 2 == 0 {
true
} else {
*x += 100;
false
}
});
assert_eq!(vec, [101, 103]);
}
它还允许你获取被移除的元素,因为整个方法的返回值是一个迭代器!
【讨论】: