Hoe de waarde van een sleutel in std::map
bij te werken na gebruik van de find
-methode?
Ik heb een kaart- en iteratordeclaratie als volgt:
map <char, int> m1;
map <char, int>::iterator m1_it;
typedef pair <char, int> count_pair;
Ik gebruik de kaart om het aantal keren dat een teken voorkomt op te slaan.
Ik gebruik Visual C++ 2010.
Antwoord 1, autoriteit 100%
std::map::find
retourneert een iterator naar het gevonden element (of naar de end()
als het element niet werd gevonden). Zolang de map
geen const is, kun je het element wijzigen waarnaar de iterator verwijst:
std::map<char, int> m;
m.insert(std::make_pair('c', 0)); // c is for cookie
std::map<char, int>::iterator it = m.find('c');
if (it != m.end())
it->second = 42;
Antwoord 2, autoriteit 41%
Ik zou de operator[] gebruiken.
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'
Dus met deze techniek wordt het heel gemakkelijk om alle karakters uit een stream te lezen en ze te tellen:
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
}
Antwoord 3, autoriteit 5%
U kunt de std::map::at
lidfunctie gebruiken, deze retourneert een verwijzing naar de toegewezen waarde van het element geïdentificeerd met de sleutel k.
std::map<char,int> mymap = {
{ 'a', 0 },
{ 'b', 0 },
};
mymap.at('a') = 10;
mymap.at('b') = 20;
Antwoord 4
U kunt de waarde als volgt bijwerken
auto itr = m.find('ch');
if (itr != m.end()){
(*itr).second = 98;
}
Antwoord 5
Je kunt het ook zo doen-
std::map<char, int>::iterator it = m.find('c');
if (it != m.end())
(*it).second = 42;
Antwoord 6
Als u de sleutel al kent, kunt u de waarde bij die sleutel direct bijwerken met m[key] = new_value
Hier is een voorbeeldcode die kan helpen:
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