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?
Respuesta
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.
-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. –
@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
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
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
}
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
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. :-) –
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
- 1. Cómo insertar en std :: map?
- 2. comprobar si un std :: vector contiene un determinado objeto?
- 3. Usando char * como clave en std :: map
- 4. Comprobar si WPF DataRowView contiene una columna
- 5. ¿Por qué insertar desde std :: map no quiere actualizar? [C++]
- 6. Usando std :: string como clave para std :: map
- 7. std :: map insert o std :: map find?
- 8. cómo comprobar si una lista contiene una lista secundaria
- 9. Comprobar si existe una clave en Memcache
- 10. cómo comprobar si la cadena contiene carácter '+'
- 11. ¿Cómo comprobar si una tabla contiene un elemento en Lua?
- 12. ¿Cómo comprobar si una matriz contiene término específico - Android
- 13. MySQL: Insertar si existe una clave externa
- 14. Evitando la construcción de la clave para std :: map :: find()
- 15. Android: ¿Cómo comprobar si una ruta contiene un punto tocado?
- 16. Cómo comprobar si una cadena contiene espacios en blanco
- 17. Cómo comprobar si una cadena contiene alguna de las cadenas
- 18. Cómo comprobar si una cadena contiene solo caracteres específicos
- 19. ¿Cómo comprobar si una cadena contiene dos caracteres de asterisco?
- 20. Ruby: ¿Cómo comprobar si una cadena contiene varios elementos?
- 21. ¿Cómo comprobar si una cadena contiene letras inglesas (A-Z)?
- 22. ¿Cómo comprobar si una lista contiene sólo #t
- 23. C++ std :: map o std :: set - insertar de manera eficiente duplicados
- 24. Comprobar si la cadena contiene todo "?"
- 25. Comprobar si la URL contiene parámetros
- 26. ¿Comprobar cadena si contiene solo caracteres latinos?
- 27. ¿Cómo encontrar si un elemento existe en std :: map?
- 28. ¿Cómo comprobar si una clase hereda otra clase sin instanciarla?
- 29. std :: map ordena por datos?
- 30. ¿Cómo probar si un diccionario contiene una clave específica?
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