2016-02-23 1 views
2

Ayant un VecDequedeq et un item, comment puis-je savoir si deq contient item? Je peux le faire avec un itérateur:Vérifiez si VecDeque contient un élément

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

Mais c'est beaucoup de code. Je veux juste dire deq.contains(item), mais VecDeque n'a pas une telle méthode (éditer: pas vrai plus, voir my answer). Des alternatives?

+0

Je suppose que 'Vec' et' VecDeque' n'exposent pas cette méthode car il faudra toujours une opération 'O (n)' pour ces structures de données. Peut-être qu'une structure de données différente serait plus appropriée pour votre cas? – Shepmaster

+1

@Shepmaster en fait, 'Vec' expose' contains() 'à travers son deref à une tranche: [ici] (http://doc.rust-lang.org/std/primitive.slice.html#method.contains). –

+0

@VladimirMatveev c'est ce que je reçois pour assumer! – Shepmaster

Répondre

3

En Rust 1.12 une méthode contains a été stabilisé pour LinkedList et VecDeque. Par conséquent, la bonne réponse est maintenant la plus évidente:

deq.contains(item) 
4

La façon plus simple serait probablement

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

mais il semble y avoir aucun moyen plus facile.

+0

Vous pouvez créer un trait d'extension 'Contains' et l'implémenter pour' VecDeque' (et d'autres collections?) En utilisant ce code. Ensuite, vous obtenez le code le plus court, tout en restant conscient des problèmes d'algorithmes. – Shepmaster

3

Comme Vladimir Matveev m'a fait remarquer dans les commentaires, une tranche a une méthode contains, vous pourriez donc utiliser aussi que sur les tranches intérieures:

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

Comme je l'ai mentionné dans un autre commentaire, vous pouvez faire un trait pour vous donner l'interface agréable:

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) 
    } 
}