¿Cómo actualizar el valor de una clave std::mapdespués de usar el findmétodo?
Tengo un mapa y una declaración de iterador como esta:
map <char, int> m1;
map <char, int>::iterator m1_it;
typedef pair <char, int> count_pair;
Estoy usando el mapa para almacenar el número de apariciones de un personaje.
Estoy usando Visual C ++ 2010.

mapdocumentación para conocer las diversas funciones proporcionadas pormap.error: assignment of member 'std::pair<char* const, char*>::second' in read-only object:(Usaría el operador [].
map <char, int> m1; m1['G'] ++; // If the element 'G' does not exist then it is created and // initialized to zero. A reference to the internal value // is returned. so that the ++ operator can be applied. // If 'G' did not exist it now exist and is 1. // If 'G' had a value of 'n' it now has a value of 'n+1'Entonces, al usar esta técnica, es realmente fácil leer todos los caracteres de una secuencia y contarlos:
map <char, int> m1; std::ifstream file("Plop"); std::istreambuf_iterator<char> end; for(std::istreambuf_iterator<char> loop(file); loop != end; ++loop) { ++m1[*loop]; // prefer prefix increment out of habbit }fuente
[]después de haberlo usadofind(no creo que esa sea tu intención).end()iterador es un comportamiento indefinido que no necesita generar unSIGSEGV(y en mi experiencia es poco probable que lo haga).Puede usar la
std::map::atfunción miembro, devuelve una referencia al valor mapeado del elemento identificado con la clave k.std::map<char,int> mymap = { { 'a', 0 }, { 'b', 0 }, }; mymap.at('a') = 10; mymap.at('b') = 20;fuente
Si ya conoce la clave, puede actualizar directamente el valor en esa clave usando
m[key] = new_valueAquí hay un código de muestra que puede ayudar:
map<int, int> m; for(int i=0; i<5; i++) m[i] = i; for(auto it=m.begin(); it!=m.end(); it++) cout<<it->second<<" "; //Output: 0 1 2 3 4 m[4] = 7; //updating value at key 4 here cout<<"\n"; //Change line for(auto it=m.begin(); it!=m.end(); it++) cout<<it->second<<" "; // Output: 0 1 2 3 7fuente
También puedes hacer esto-
std::map<char, int>::iterator it = m.find('c'); if (it != m.end()) (*it).second = 42;fuente
Puede actualizar el valor como sigue
auto itr = m.find('ch'); if (itr != m.end()){ (*itr).second = 98; }fuente