Comment trouver si un élément existe dans std :: map?

Mon cas d’utilisation:

map cars; bool exists(const ssortingng& name) { // somehow I should find whether my MAP has a car // with the name provided return false; } 

Pourriez-vous s’il vous plaît suggérer le meilleur et le plus élégant moyen de le faire en C ++? Merci.

Bien sûr, utilisez un iterator

 map::const_iterator it = cars.find(name); return it!=cars.end(); 
 return cars.find(name) != cars.end(); 

Vous pouvez aussi utiliser

 bool exists(const ssortingng& name) { return cars.count(name) != 0; } 

Outre les réponses avec iterateur-valeur de find () et comparaison avec .end (), il existe une autre façon: map :: count.

Vous pouvez appeler map :: count (key) avec une clé spécifique; il retournera le nombre d’entrées pour la clé donnée. Pour les cartes avec des clés uniques, le résultat sera 0 ou 1. Puisque multimap existe aussi avec la même interface, mieux vaut comparer avec! = 0 pour que l’existence soit sûre.

pour votre exemple, c’est

 return (cars.count(name)>0); 

Les avantages que je vois sont: 1. un code plus court, 2. bénéficier des optimisations que la bibliothèque peut appliquer en interne, en utilisant ses détails de représentation.

Qu’en est-il de:

 template  bool exists_in(Collection const& haystack, KeyType const& needle) { return std::find(haystack.begin(), haystack.end(), needle) != haystack.end(); } template  bool exists_in(std::map const& haystack, K const& needle) { return haystack.find(needle) != haystack.end(); } 

Cela fait fonctionner exists_in avec n’importe quel conteneur standard via std::find et utilise une version spéciale pour std::map car elle offre une alternative de recherche plus efficace. Vous pouvez append des spécialisations supplémentaires si nécessaire (par exemple, pour std::set et autres).

 bool exists(const ssortingng& name) { return cars.find(name) != cars.end(); } 

std::map::find(const key_type& x );

Il retourne map::end si l’élément n’existe pas.

 bool exists(const std::map& cars, const std::ssortingng& name) { return cars.end() != cars.find(name); } 
 #define itertype(v) typeof((v).begin()) itertype(cars) it = cars.find(name); return it != cars.end();