2010-01-08 26 views
5

Estoy tratando de insertar varias veces esta misma clave en el mapa, pero con diferentes valores. No funciona Sé que el operador [] hace este trabajo, pero mi pregunta es si este comportamiento de inserción es correcto. ¿No debería insertar inserciones()? Me pregunto qué dice el estándar. Desafortunadamente no lo tengo (Estándar para C++) así que no puedo verificarlo.
Gracias por su ayuda.¿Por qué insertar desde std :: map no quiere actualizar? [C++]

Respuesta

14

Si desea insertar la misma clave con diferentes valores , en su lugar, necesita std::multimap.

El std::map::insert no hará nada si la clave ya existe. El std::map::operator[] sobrescribirá el valor anterior.

Para la referencia STL no necesita el estándar C++ en sí mismo; algo como http://www.cplusplus.com/reference/ también lo hará.

+0

Gracias. Y porque tengo que tener al menos 15 caracteres estoy escribiendo este texto. –

5

No estoy seguro de entender completamente, pero parece que está sobrescribiendo sus entradas anteriores en el mapa; Un map solo almacena un valor de por clave.

Más bien, necesitaría usar multi_map. Esto le permitirá insertar la misma clave con diferentes valores. Usted pierde operator[] de esta manera, ya que realmente no tendría sentido. (. Al insertar, seguro, pero ese operador también recupera un valor que debería recuperar?)

He aquí un ejemplo (modificado de here):

#include <iostream> 
#include <map> 

int main(void) 
{ 
    std::multimap<std::string, int> m; 

    m.insert(std::make_pair("a", 1)); 
    m.insert(std::make_pair("b", 2)); 
    m.insert(std::make_pair("c", 3)); 
    m.insert(std::make_pair("a", 4)); 
    m.insert(std::make_pair("b", 5)); 
    m.insert(std::make_pair("a", 6)); 

    std::cout << "Number of elements with key a: " << m.count("a") << endl; 
    std::cout << "Number of elements with key b: " << m.count("b") << endl; 
    std::cout << "Number of elements with key c: " << m.count("c") << endl; 

    std::cout << "Elements in m: " << endl; 
    for (m::iterator it = m.begin(); it != m.end(); ++it) 
    { 
     std::cout << " [" << it->first << ", " << it->second << "]" << endl; 
    } 
} 
Cuestiones relacionadas