2011-08-27 9 views
20

En boost::unordered_map ¿cómo puedo determinar si existe una clave en ella o no?C++ boost unordered_map: determine si la clave existe en el contenedor

boost::unordered_map<vector<int>, MyValueType> my_hash_map; 

if (my_hash_map[non-existent key] == NULL) 

El error de compilación anterior consigue "no puede competir con el operador '==' ..."

¿El problema es que estoy usando un tipo de valor personalizado o algo más?

Respuesta

30

Puede utilizar el método find:

if (my_hash_map.find(non-existent key) == my_hash_map.end()) 
+4

... como con cualquier contenedores compatibles con el estándar, por cierto. – xtofl

+0

Seguimiento rápido, ¿esto todavía se hace en O (1)? ¡Gracias! – gewizz

+2

Supongo que sí, ya que unordered_map es una tabla hash. –

25

exist() se escribe count() para cualquier associative container:

if (my_hash_map.count(key)) { /*key exist*/ } 

if (!my_hash_map.count(key)) { /*key does not exist*/ } 
+5

No es lo que suele importar, pero puedo imaginar que 'count()' sea más caro, especialmente si tiene varios valores por clave, porque tiene que iterar sobre todos ellos. –

+0

@ Lukáš Lalinský: Sí, para 'multi_ *' contenedores 'count()' puede tener un peor rendimiento que 'find()'. – dalle

+0

Dependiendo del tamaño de 'my_hash_map', aún se podría preferir el método' .count() '(en lugar de' .find() '), ya que maneja correctamente el caso del límite donde' my_hash_map' contiene una única clave/valor (s) par. – Kris

Cuestiones relacionadas