¿Cómo actualizar el valor de una clave std::map
después de usar el find
mé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.
map
documentació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::at
funció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_value
Aquí 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 7
fuente
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