使用 find 方法后如何更新 std: : map?

使用 find方法后,如何更新 std::map中键的值?

我有一个这样的 map 和迭代器声明:

map <char, int> m1;
map <char, int>::iterator m1_it;
typedef pair <char, int> count_pair;

我使用映射来存储一个字符的出现次数。

我使用的是 Visual C + + 2010。

224660 次浏览

std::map::find returns an iterator to the found element (or to the end() if the element was not found). So long as the map is not const, you can modify the element pointed to by the iterator:

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;

I would use the operator[].

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'

So using this technique it becomes really easy to read all the character from a stream and count them:

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
}

You can use std::map::at member function, it returns a reference to the mapped value of the element identified with key k.

std::map<char,int> mymap = {
{ 'a', 0 },
{ 'b', 0 },
};


mymap.at('a') = 10;
mymap.at('b') = 20;

You can also do like this-

 std::map<char, int>::iterator it = m.find('c');
if (it != m.end())
(*it).second = 42;

If you already know the key, you can directly update the value at that key using m[key] = new_value

Here is a sample code that might help:

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

You can update the value like following

   auto itr = m.find('ch');
if (itr != m.end()){
(*itr).second = 98;
}