How to update std::map after using the find method?
Solution 1
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;
Solution 2
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
}
Solution 3
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;
Solution 4
You can update the value like following
auto itr = m.find('ch');
if (itr != m.end()){
(*itr).second = 98;
}
Related videos on Youtube
jaykumarark
Graphics programmer. Philosophy: Understand nature through computer graphics.
Updated on August 25, 2020Comments
-
jaykumarark over 3 years
How to update the value of a key in
std::map
after using thefind
method?I have a map and iterator declaration like this:
map <char, int> m1; map <char, int>::iterator m1_it; typedef pair <char, int> count_pair;
I'm using the map to store the number of occurrences of a character.
I'm using Visual C++ 2010.
-
alex gimenez almost 3 yearsunless the only thing you want to do is to updated the value, and you are already certain that the key exists (or you don't care if a new key gets created), you don't want to use this strategy. Kind of a narrow application. In almost all cases, you are better off doing a map::find() first, getting an iterator and updating iterator->second, as the other answers proposed.