2014-10-07 119 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);