De hecho, el método de inserción que toma un parámetro de sugerencia no devuelve si la inserción tuvo éxito o no. Una forma de verificar si la inserción realmente sucedió sería verificar el tamaño del mapa antes y después de la inserción. Si es lo mismo, la inserción ha fallado (es decir, la clave ya estaba presente). Sé que suena feo, pero esa es la forma más eficiente que se me ocurrió. De hecho, creo que no hay una razón convincente para que la inserción con una pista no deba devolver un par (incluido el valor booleano) al igual que la inserción normal sin pista. Pero una vez que se ha especificado en un estándar anterior, es muy difícil cambiarlo, ya que es un cambio radical que la comunidad de C++ resiente en su mayoría.
Respuesta original (incorrecta)
Ver este enlace
... devuelve un par, con su miembro pair::first
establecido en un iterador que apunta al elemento recién insertado o al elemento que ya tenía su mismo valor en el mapa. El pair::second
elemento en el par se establece en verdadero si se insertó un nuevo elemento o en falso si ya existía un elemento con el mismo valor.
El enlace también contiene un ejemplo
Por ejemplo:
if(mp.insert(make_pair(key, value)).second == false)
{
cout << "Insertion failed. Key was present"
}
typedef std::map<std::string, int> map;
map m;
std::pair<map::iterator,bool> result = m.insert(std::make_pair("hi", 42));
resultado.segundo contiene lo que quieres
Depende de lo que entiendas por fallido o exitoso.
std::map::insert
tiene éxito cuando inserta el nuevo elemento; de lo contrario, devuelve un iterador a un elemento ya existente.
std::map::insert
falla si no hay suficiente memoria para insertar un nuevo elemento y lanza std::bad_alloc
.