Comment mettre à jour la valeur d'une clé std::map
après avoir utilisé la find
méthode?
J'ai une carte et une déclaration d'itérateur comme celle-ci:
map <char, int> m1;
map <char, int>::iterator m1_it;
typedef pair <char, int> count_pair;
J'utilise la carte pour stocker le nombre d'occurrences d'un personnage.
J'utilise Visual C ++ 2010.
map
documentation pour les différentes fonctions fournies parmap
.error: assignment of member 'std::pair<char* const, char*>::second' in read-only object
:(J'utiliserais l'opérateur [].
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'
Donc, en utilisant cette technique, il devient vraiment facile de lire tous les caractères d'un flux et de les compter:
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 }
la source
[]
après avoir utiliséfind
(je ne pense pas que c'était votre intention).end()
itérateur est un comportement indéfini dont il n'a pas besoin pour générer unSIGSEGV
(et d'après mon expérience, il est peu probable qu'il le fasse).Vous pouvez utiliser la
std::map::at
fonction membre, elle renvoie une référence à la valeur mappée de l'élément identifié avec la clé k.std::map<char,int> mymap = { { 'a', 0 }, { 'b', 0 }, }; mymap.at('a') = 10; mymap.at('b') = 20;
la source
Si vous connaissez déjà la clé, vous pouvez directement mettre à jour la valeur de cette clé en utilisant
m[key] = new_value
Voici un exemple de code qui pourrait vous aider:
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
la source
Vous pouvez aussi faire comme ça-
std::map<char, int>::iterator it = m.find('c'); if (it != m.end()) (*it).second = 42;
la source
Vous pouvez mettre à jour la valeur comme suit
auto itr = m.find('ch'); if (itr != m.end()){ (*itr).second = 98; }
la source