70 votes

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

Mon cas d'utilisation:

 map<string, Car> cars;
bool exists(const string& 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 moyen le plus élégant et le plus élégant de le faire en C ++? Merci.

86voto

KennyTM Points 232647
return cars.find(name) != cars.end();

66voto

Tom Points 16783

Bien sûr, utilisez un itérateur

 map<string,Car>::const_iterator it = cars.find(name);
return it!=cars.end();
 

27voto

Vous pouvez aussi utiliser

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

21voto

foo Points 971

Outre les réponses avec itérateur-Valeur de find() et à la comparaison .end(), il existe une autre façon: map::count.

Vous pouvez appeler map::count(clé) avec une clé spécifique; elle renvoie le nombre d'entrées existent pour la clé donnée. Pour les cartes avec des clés uniques, le résultat sera 0 ou 1. Depuis multimap existe aussi avec la même interface, de mieux comparer avec != 0 pour l'existence, pour être sur le côté sécuritaire.

pour ton exemple, c'est

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

Les avantages que je vois sont 1. plus courte de code, 2. profiter de ce que des optimisations de la bibliothèque peuvent s'appliquer à l'interne, à l'aide de sa représentation de détails.

10voto

D.Shawley Points 30324

Qu'en est-il de:

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

template <typename K, typename V>
bool exists_in(std::map<K,V> const& haystack, K const& needle) {
    return haystack.find(needle) != haystack.end();
}
 

Cela permet à exists_in travailler avec n’importe quel conteneur standard via std::find et d’utiliser une version spéciale pour std::map car il offre une alternative de recherche plus efficace. Vous pouvez ajouter des spécialisations supplémentaires si nécessaire (par exemple, pour std::set et autres).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X