2010-10-07 9 views
107

La seule façon que j'ai trouvé pour vérifier les doublons est en insérant et en vérifiant le std::pair.second pour false, mais le problème est que cela insère encore quelque chose si la clé est inutilisée, alors que ce que je veux est une fonction map.contains(key);.Comment vérifier si std :: map contient une clé sans faire d'insertion?

+3

double possible de [Comment trouver si une clé existe donné dans un C++ std :: carte] (http://stackoverflow.com/questions/1939953/how-to-find-if-a-given -key-exists-in-ac-stdmap) – OrangeDog

Répondre

231

Utiliser my_map.count(key); il ne peut retourner que 0 ou 1, ce qui est essentiellement le résultat booléen que vous voulez.

Alternativement my_map.find(key) != my_map.end() fonctionne aussi.

+5

-1: Devrait utiliser 'find'. Il est au moins aussi efficace que «count» pour les cartes et les multimappes, et plus efficace lorsque vous considérez le besoin typique d'apporter des modifications aux clés trouvées. –

+29

@John: Cela sent l'optimisation prématurée. Sur GCC (et je suis sûr que les systèmes les plus raisonnables), 'map :: count' est implémenté comme' find (__x) == end()? 0: 1; Pour 'multimap', vous pouvez avoir un argument de performance, mais ce n'est pas la question de l'OP et je préfère toujours l'élégance. – Potatoswatter

+24

Non, l'argument d'optimisation prématurée n'est valide que si l'optimisation nécessite un effort qui, dans ce cas, ne l'est pas. – markh44

39

La réponse de Potatoswatter est correcte, mais je préfère utiliser find ou lower_bound à la place. lower_bound est particulièrement utile parce que l'itérateur retourné peut ensuite être utilisé pour une insertion suggérée, si vous souhaitez insérer quelque chose avec la même clé.

map<K, V>::iterator iter(my_map.lower_bound(key)); 
if (iter == my_map.end() || key < iter->first) { // not found 
    // ... 
    my_map.insert(iter, make_pair(key, value));  // hinted insertion 
} else { 
    // ... use iter->second here 
} 
+0

Ceci est subtilement différent de comment il dit qu'il le fait ... la seule différence est que le calcul de 'value' peut être ignoré si l'insertion est inutile. – Potatoswatter

+0

Bien sûr, je comprends que l'OP ne se soucie pas d'insérer, donc une solution basée sur 'lower_bound' est trop lourde. Je viens juste de mentionner ma réponse "pour l'exhaustivité"; Comme je l'ai dit, le tien est parfaitement adéquat. :-) –

+3

Oui, c'est une bonne réponse et je ne suis pas en désaccord avec quoi que ce soit. Juste en soulignant la relation à l'alternative de «insérer» a priori. En fait, il existe une autre différence si vous utilisez un multimap, la méthode 'lower_bound' s'insère au début de la plage équivalente alors que la méthode simple' insert' ajoute à la fin de la plage. – Potatoswatter