2014-10-07 91 views
6

是否有一种简单的方法可以从Vec<T>中删除元素?从矢量中删除元素

有一种方法叫做remove(),它需要一个index: usize,但是我甚至没有看到的方法。

我正在寻找一些(希望)简单和O(n)。

回答

10

这就是我想出迄今(也使得借检查开心):

let index = xs.iter().position(|x| *x == some_x).unwrap(); 
xs.remove(index); 

我仍然等待找到更好的方法来做到这一点,因为这很丑陋。

注:我的代码假定元素确实存在(因此为.unwrap())。

+0

请注意,stdlib仍在设计中,因此它可能缺少其他语言中常见的一些功能。随意提交公关添加! – aochagavia 2014-10-08 08:52:29

7

迭代器有一个position()方法,它返回匹配谓词的第一个元素的索引。相关问题:Is there an equivalent of JavaScript's indexOf for Rust arrays?

和代码示例:

fn main() { 
    let mut vec = vec![1, 2, 3, 4]; 

    println!("Before: {:?}", vec); 

    let removed = vec.iter() 
     .position(|&n| n > 2) 
     .map(|e| vec.remove(e)) 
     .is_some(); 

    println!("Did we remove anything? {}", removed); 

    println!("After: {:?}", vec); 
} 
+1

这并不编译:'xs.remove(xs.iter()位置(| X | * X == some_x)。 unwrap());' - “不能借用'xs'作为不可变的,因为它也被借用为可变” – 2014-10-07 18:53:16

+1

@Kai Sellgren:也被称为:不要修改你正在迭代的容器。 – 2014-10-10 13:11:39

4

可以使用retain method但它会删除该值的每一个实例:

fn main() { 
    let mut xs = vec![1, 2, 3]; 
    let some_x = 2; 
    xs.retain(|&x| x != some_x); 
    println!("{:?}", xs); // prints [1, 3] 
} 
+0

找到元素后进行比较是不必要的 – malbarbo 2016-11-18 11:42:01

+1

@malbarbo是的,这是因为此方法删除了该值的每个实例。 – antoyo 2016-11-18 13:41:48

5

有一个实验性的API,叫Vec::remove_item()。它仍然不稳定,所以它不适用于稳定的编译器。但最终可能会稳定下来(tracking issue)。 。

根据该方法,做你想要真的是很简单:

let removed = xs.remove_item(&some_x);