Comment vérifier si std::map contient une clé sans faire insérer?
Le seul moyen que j'ai trouvé pour vérifier les doublons est par l'insertion, et de la vérification de la std::pair.second
pour false
, mais le problème est que cela insère quelque chose de si la clé n'est pas utilisé, alors que ce que je veux c'est un map.contains(key);
fonction.
- double possible de Comment savoir si une clé existe en C++ std::map
Vous devez vous connecter pour publier un commentaire.
Utilisation
my_map.count( key )
; il ne peut retourner la valeur 0 ou 1, ce qui est essentiellement le résultat Booléen vous le souhaitez.Alternativement
my_map.find( key ) != my_map.end()
travaille trop.find
. Il est au moins aussi efficace quecount
pour les cartes et multimaps, et plus efficace lorsque l'on considère l'typiques de la nécessité d'apporter des modifications à l'trouvent les clés.map::count
est mis en œuvre commefind(__x) == end() ? 0 : 1;
. Pourmultimap
la vous pouvez avoir un rendement argument, mais ce n'est pas OP question et je préfère encore l'élégance.my_map.count(key) > 0
plus représentatif de "cette clé apparaissent dans la carte?" quemy_map.find(key) != my_map.end()
. Où @JohnDibling dit "plus efficace lorsque vous avez besoin de faire des changements", je dirais, "Si vous avez besoin d'utiliser la trouvé la clé, de l'enregistrer et de test contreend()
. Si vous avez juste besoin de vérifier l'existence, de l'utilisationcount
." Différentes méthodes pour différents besoins peuvent aider à la lisibilité.has(k)
/contains(k)
comme tous les autres sane carte de classe de la planète. Mauvaise conception de l'interface. Find (), dont l'approche est trop verbeux et lacount(k)
approche n'est certainement pas à la sémantique de la parité avechas(k)
. Pour que la matière n'estfind(k)
. Découvrez le nombre de vues sur cette question.Potatoswatter la réponse est bonne, mais je préfère utiliser
find
oulower_bound
à la place.lower_bound
est particulièrement utile parce que l'itérateur renvoyé peut être utilisé par la suite pour une allusion insertion, si vous voulez insérer quelque chose avec la même clé.value
peut être ignoré si l'insertion est inutile.lower_bound
à base de solution est exagéré. Je viens de le mentionner ma réponse "à des fins d'exhaustivité", comme je l'ai dit, le vôtre est parfaitement adéquate. 🙂insert
a priori. En fait, il y a une autre différence, si à l'aide d'unmultimap
, lelower_bound
méthode insère au début de l'équivalent de la gamme alors que la plaineinsert
méthode ajoute à la fin de la plage.