La única forma en que he encontrado para verificar si hay duplicados es insertando y comprobando std::pair.second
para false
, pero el problema es que esto todavía inserta algo si la clave no se usa, mientras que lo que quiero es una map.contains(key);
función.
148
Respuestas:
Uso
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.fuente
map::count
se implementa comofind(__x) == end() ? 0 : 1;
. Paramultimap
el puede tener un argumento de rendimiento, pero esa no es la pregunta de OP y todavía prefiero la elegancia.has(k)
/contains(k)
como cualquier otra clase de mapa sensata en el planeta. Mal diseño de la interfaz. El enfoque find () es demasiado detallado ycount(k)
definitivamente no está en paridad semánticahas(k)
. Para el caso tampoco lo esfind(k)
. Mira el recuento de visitas en esta pregunta.La respuesta de Potatoswatter está bien, pero prefiero usar
find
o en sulower_bound
lugar.lower_bound
es especialmente útil porque el iterador devuelto puede usarse posteriormente para una inserción insinuada, si desea insertar algo con la misma clave.fuente
value
se puede omitir el cálculo si la inserción es innecesaria.lower_bound
solución basada en es exagerada. Acabo de mencionar mi respuesta "para completar"; como dije, el tuyo es perfectamente adecuado. :-)insert
a priori. En realidad, hay otra diferencia si se usa amultimap
, ellower_bound
método se inserta al comienzo del rango equivalente, mientras que elinsert
método simple se agrega al final del rango.Su deseo
map.contains(key)
está programado para el borrador del estándar C ++ 2a . En 2017 fue implementado por gcc 9.2 . También está en el sonido actual .fuente