178 votes

Comment vérifier si std::map contient une clé sans faire d'insertion ?

La seule façon que j'ai trouvée pour vérifier les doublons est d'insérer et de vérifier le fichier std::pair.second pour 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 un fichier map.contains(key); fonction.

6 votes

352voto

Potatoswatter Points 70305

Utilisez my_map.count( key ) il ne peut renvoyer 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.

9 votes

-1 : Devrait utiliser find . Il est au moins aussi efficace que count pour les cartes et les cartes multiples, et plus efficace si l'on considère le besoin typique d'apporter des modifications aux clés trouvées.

44 votes

@John : Cela sent l'optimisation prématurée. Sur GCC (et je suis sûr que la plupart des systèmes raisonnables), map::count est mis en œuvre 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.

46 votes

Non, l'argument de l'optimisation prématurée n'est valable que si l'optimisation demande un certain effort, ce qui n'est pas le cas ici.

49voto

Chris Jester-Young Points 102876

La réponse de Potatoswatter est très bien, mais je préfère utiliser find o lower_bound à la place. lower_bound est particulièrement utile car l'itérateur retourné peut être utilisé ultérieurement pour une insertion indirecte, 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 votes

C'est subtilement différent de la façon dont il dit qu'il le fait la seule différence est que le calcul de value peuvent être ignorés si l'insertion n'est pas nécessaire.

1 votes

Bien sûr, je comprends que l'OP ne se soucie pas d'insérer, donc un lower_bound -est excessive. J'ai en quelque sorte mentionné ma réponse "pour être complet" ; comme je l'ai dit, la vôtre est parfaitement adéquate :-)

4 votes

Oui, c'est une bonne réponse et je ne suis pas en désaccord avec quoi que ce soit. Je souligne juste la relation avec l'alternative de insert a priori. En fait, il y a une autre différence si l'on utilise un multimap El lower_bound insère au début de la plage équivalente alors que la méthode simple insert ajoute à la fin de la plage.

24voto

Votre desideratum, map.contains(key) est prévue pour le projet de norme C++2a . En 2017, il a été mis en œuvre par gcc 9.2 . C'est aussi dans l'actuel clang .

0voto

Si vous utilisez Qt, vous pouvez utiliser la classe QMap. Elle se comporte fondamentalement comme std::map, mais possède également une fonction contains()-.

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