2016-02-23 149 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) 
    } 
} 
相关问题