2012-05-24 12 views
10

He escrito el siguiente código y me sorprendió la salida. Escuché que <map> evita la colisión de teclas, pero aquí parece permitir la inserción de pares duplicados.STL <map> permite pares duplicados?

#include<iostream> 
#include<map> 

using namespace std; 

int main() 
{ 
    map<string,char> namemap; 
    namemap["yogi"]='c'; 

    namemap.insert(pair<string,char>("yogendra",'a')); 
    namemap.insert(pair<string,char>("yogendra",'b')); 

    cout<<namemap["yogendra"]<<endl; 

    return 0; 
} 

Este código muestra a. Puede ejecutarlo en C++ Shell.

¿Evitar una colisión significa que no podemos ingresar varios pares con la misma llave?

+2

¿Qué comportamiento esperabas? ¿Una excepción? ¿Sobrescribir el primer valor con el segundo? ¿Ignorando el segundo valor? ¿Un error del compilador? –

+1

Se explica claramente [aquí] (http://en.cppreference.com/w/cpp/container/map/insert) – juanchopanza

+0

@juanchopanza: a veces deseo que RTFM se considerara una respuesta suficiente: x –

Respuesta

31

El segundo insert con la misma clave no funciona. Simplemente devuelve un iterador que apunta al elemento existente.

std::map::insert() tiene un valor de retorno, que debe comprobar.

Es del tipo std::pair<iterator,bool>. El segundo elemento del par le dice si el elemento se ha insertado, o si ya había una entrada existente con la misma clave.

cout << namemap.insert(pair<string,char>("yogendra",'a')).second << endl; 
cout << namemap.insert(pair<string,char>("yogendra",'b')).second << endl; 
+0

gracias :) la solución clara duda y encuentro la solución :) –

4

Stl map no permite utilizar las mismas teclas. Es posible que desee ir a múltiples mapas para eso. !

Cuestiones relacionadas