Hoe std::map updaten na gebruik van de vindmethode?

Hoe de waarde van een sleutel in std::mapbij 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::findretourneert een iterator naar het gevonden element (of naar de end()als het element niet werd gevonden). Zolang de mapgeen 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::atlidfunctie 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    

Other episodes