Le seul moyen que j'ai trouvé pour vérifier les doublons est d'insérer et de vérifier le std::pair.second
for false
, mais le problème est que cela insère toujours quelque chose si la clé n'est pas utilisée, alors que ce que je veux, c'est une map.contains(key);
fonction.
148
Réponses:
Utiliser
my_map.count( key )
; il ne peut renvoyer que 0 ou 1, ce qui est essentiellement le résultat booléen souhaité.Fonctionne
my_map.find( key ) != my_map.end()
aussi alternativement .la source
map::count
est implémenté commefind(__x) == end() ? 0 : 1;
. Pourmultimap
le vous pouvez avoir un argument de performance, mais ce n'est pas la question d'OP et je préfère toujours l'élégance.has(k)
/contains(k)
comme toute autre classe de carte sensée de la planète. Mauvaise conception de l'interface. L'approche find () est trop verbeuse et l'count(k)
approche n'est certainement pas à la parité sémantique avechas(k)
. Pour cette question non plusfind(k)
. Vérifiez le nombre de vues sur cette question.La réponse de Potatoswatter est correcte, mais je préfère utiliser
find
ou à lalower_bound
place.lower_bound
est particulièrement utile car l'itérateur renvoyé peut ensuite être utilisé pour une insertion suggérée, si vous souhaitez insérer quelque chose avec la même clé.la source
value
peut être ignoré si l'insertion n'est pas nécessaire.lower_bound
solution basée sur une solution est exagérée. Je viens de mentionner ma réponse "par souci d'exhaustivité"; comme je l'ai dit, la vôtre est parfaitement adéquate. :-)insert
a priori. En fait, il y a une autre différence si vous utilisez amultimap
, lalower_bound
méthode insère au début de la plage équivalente alors que lainsert
méthode simple ajoute à la fin de la plage.Votre desideratum,,
map.contains(key)
est prévu pour le projet de norme C ++ 2a . En 2017, il a été implémenté par gcc 9.2 . C'est aussi dans le bruit actuel .la source