2016-02-23 147 views
2

VecDequedeqitem,我如何知道deq是否包含item?我可以用迭代器來實現:檢查VecDeque是否包含元素

deq.iter().find(|e| e == item).is_none() 

但是這是很多代碼。我只想說deq.contains(item),但VecDeque沒有這樣的方法(編輯:不再是真實的,請參閱my answer)。任何替代品?

+0

我認爲'Vec'和'VecDeque'因爲它總是必須是一個'O(n)的'操作不公開這個方法這些數據結構。也許不同的數據結構會更適合您的情況? – Shepmaster

+1

@Shepmaster事實上,'Vec'通過它的deref將'contains()'暴露給一個切片:[here](http://doc.rust-lang.org/std/primitive.slice.html#method.contains )。 –

+0

@VladimirMatveev這是我得到的假設! – Shepmaster

回答

4

的簡單的方法很可能是

deq.iter().any(|e| e == item) 

但似乎沒有更簡單的方法。

+0

你可以使用這段代碼創建一個'Contains'擴展特徵併爲'VecDeque'(和其他集合?)實現它。然後你得到較短的代碼,但仍然意識到算法問題。 – Shepmaster

3

正如弗拉基米爾Matveev在評論中向我指出,切片具有contains方法,所以你也可以使用,內層片:

let (a, b) = deq.as_slices(); 
a.contains(item) || b.contains(item) 

正如我在另一條評論中提到,你可以做一個特質給你漂亮的界面:

trait Contains<T> { 
    fn contains(&self, item: &T) -> bool; 
} 

impl<T> Contains<T> for VecDeque<T> 
    where T: PartialEq 
{ 
    fn contains(&self, item: &T) -> bool { 
     let (a, b) = self.as_slices(); 
     a.contains(item) || b.contains(item) 
    } 
} 
相關問題