有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