web-dev-qa-db-fra.com

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

Le seul moyen que j’ai trouvé pour vérifier les doublons est d’insérer et de vérifier le std::pair.second pour false, mais le problème est que cela insère toujours quelque chose si la clé est inutilisée, alors que je veux un map.contains(key); function.

138
jmasterx

Utilisez my_map.count( key ); il ne peut que renvoyer 0 ou 1, ce qui correspond essentiellement au résultat booléen souhaité.

Sinon, my_map.find( key ) != my_map.end() fonctionne aussi.

284
Potatoswatter

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 car l'itérateur renvoyé peut ensuite être utilisé pour une insertion indicé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
}
46

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

0
Camille Goudeseune