有VecDeque
deq
和item
,我如何知道deq
是否包含item
?我可以用迭代器来实现:检查VecDeque是否包含元素
deq.iter().find(|e| e == item).is_none()
但是这是很多代码。我只想说deq.contains(item)
,但VecDeque
没有这样的方法(编辑:不再是真实的,请参阅my answer)。任何替代品?
有VecDeque
deq
和item
,我如何知道deq
是否包含item
?我可以用迭代器来实现:检查VecDeque是否包含元素
deq.iter().find(|e| e == item).is_none()
但是这是很多代码。我只想说deq.contains(item)
,但VecDeque
没有这样的方法(编辑:不再是真实的,请参阅my answer)。任何替代品?
在Rust 1.12一个contains
方法是稳定的LinkedList
和VecDeque
。因此,正确的答案是现在明显:
deq.contains(item)
的简单的方法很可能是
deq.iter().any(|e| e == item)
但似乎没有更简单的方法。
你可以使用这段代码创建一个'Contains'扩展特征并为'VecDeque'(和其他集合?)实现它。然后你得到较短的代码,但仍然意识到算法问题。 – Shepmaster
正如弗拉基米尔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)
}
}
我认为'Vec'和'VecDeque'因为它总是必须是一个'O(n)的'操作不公开这个方法这些数据结构。也许不同的数据结构会更适合您的情况? – Shepmaster
@Shepmaster事实上,'Vec'通过它的deref将'contains()'暴露给一个切片:[here](http://doc.rust-lang.org/std/primitive.slice.html#method.contains )。 –
@VladimirMatveev这是我得到的假设! – Shepmaster