La única forma en que he encontrado para verificar si hay duplicados es insertando y comprobando std::pair.secondpara 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::countse implementa comofind(__x) == end() ? 0 : 1;. Paramultimapel 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
findo en sulower_boundlugar.lower_boundes especialmente útil porque el iterador devuelto puede usarse posteriormente para una inserción insinuada, si desea insertar algo con la misma clave.fuente
valuese puede omitir el cálculo si la inserción es innecesaria.lower_boundsolución basada en es exagerada. Acabo de mencionar mi respuesta "para completar"; como dije, el tuyo es perfectamente adecuado. :-)inserta priori. En realidad, hay otra diferencia si se usa amultimap, ellower_boundmétodo se inserta al comienzo del rango equivalente, mientras que elinsertmé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