2010-10-07 31 views
107

La única forma que he encontrado para buscar duplicados es mediante la inserción y comprobación del std::pair.second para false, pero el problema es que esto todavía inserta algo si la clave no se utiliza, mientras que lo que deseo es una función map.contains(key);.¿Cómo comprobar si std :: map contiene una clave sin insertar?

+3

posible duplicado de [¿Cómo encontrar si existe una clave dada en un C++ std :: mapa] (http://stackoverflow.com/questions/1939953/how-to-find-if-a-given -key-exists-in-ac-stdmap) – OrangeDog

Respuesta

231

Utilice my_map.count(key); solo puede devolver 0 o 1, que es esencialmente el resultado booleano que desea.

Alternativamente my_map.find(key) != my_map.end() funciona también.

+5

-1: Debería usar 'find'. Es al menos tan eficiente como 'conteo' para mapas y multimapas, y más eficiente cuando se considera la necesidad típica de realizar cambios en las claves encontradas. –

+29

@John: Eso apesta a una optimización prematura. En GCC (y estoy seguro de que la mayoría de los sistemas son razonables), 'map :: count' se implementa como' find (__ x) == end()? 0: 1; '. Para 'multimap' puede tener un argumento de rendimiento, pero esa no es la pregunta de OP y aún prefiero la elegancia. – Potatoswatter

+24

No, el argumento de optimización prematura solo es válido si la optimización requiere un esfuerzo que en este caso no es así. – markh44

39

La respuesta de Potatoswatter está bien, pero en su lugar prefiero usar find o lower_bound. lower_bound es especialmente útil porque el iterador devuelto puede utilizarse posteriormente para una inserción insinuada, en caso de que desee insertar algo con la misma clave.

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

Esto es sutilmente diferente de cómo él dice que lo está haciendo ... la única diferencia es que se puede omitir el cálculo de 'valor' si la inserción no es necesaria. – Potatoswatter

+0

Claro, entiendo que al OP no le importa insertar, entonces una solución basada en 'low_bound' es exagerada. Acabo de mencionar mi respuesta "para completar"; como dije, el tuyo es perfectamente adecuado. :-) –

+3

Sí, esta es una buena respuesta y no estoy en desacuerdo con nada. Simplemente señalando la relación con la alternativa de 'insertar' a priori. En realidad, hay otra diferencia si se usa un 'multimap', el método' low_bound' se inserta al comienzo del rango equivalente, mientras que el método plain 'insert' se agrega al final del rango. – Potatoswatter

Cuestiones relacionadas