Wor*_*der 15 predicate vector rust
我试图从矢量中删除一些元素,基于谓词,并收集结果.这是一个具有预期结果的(不工作)示例:
let mut v: Vec<i32> = vec![1, 2, 3, 4, 5, 6];
let drained: Vec<i32> = v.iter().filter(|e| (*e) % 2 == 0).drain(..).collect();
assert_eq!(v, vec![1, 3, 5]);
assert_eq!(drained, vec![2, 4, 6]);
这导致错误
error[E0599]: no method named `drain` found for type `std::iter::Filter<std::slice::Iter<'_, i32>, [closure@src/main.rs:4:45: 4:62]>` in the current scope
 --> src/main.rs:4:64
  |
4 |     let drained: Vec<i32> = v.iter().filter(|e| (*e) % 2 == 0).drain(..).collect();
  |                                                                ^^^^^
我看过几种不同的选择,它们似乎都没有做我想做的事情:
Vec::retain 从向量中删除元素,但不会返回已删除元素的所有权.
v.drain(..).filter(condition).collect()返回正确的值,drained但清空整个向量.
She*_*ter 13
不稳定Rust 1.20.0.有一个不稳定的夜间功能称为drain_filter完全符合您的要求:
#![feature(drain_filter)]
fn main() {
    let mut v: Vec<i32> = vec![1, 2, 3, 4, 5, 6];
    let drained: Vec<i32> = v.drain_filter(|&mut e| e % 2 == 0).collect();
    assert_eq!(v, vec![1, 3, 5]);
    assert_eq!(drained, vec![2, 4, 6]);
}
作为一种稳定的解决方法,您可以使用Iterator::partition,但它不会重用内存:
fn main() {
    let v: Vec<i32> = vec![1, 2, 3, 4, 5, 6];
    let (drained, v): (Vec<_>, Vec<_>) = v.into_iter().partition(|&e| e % 2 == 0);
    assert_eq!(v, vec![1, 3, 5]);
    assert_eq!(drained, vec![2, 4, 6]);
}
| 归档时间: | 
 | 
| 查看次数: | 858 次 | 
| 最近记录: |