Bharg Bharg - 1 month ago 15
C++ Question

Editing the value in an unordered map for a given key

The following is C++ code to get a count of the words in magazine. I'm trying to add the word if its value does not exist and if it does, increment it.

unordered_map<string,int>hash;
vector<string> magazine(m);

for(int i = 0;i <m;i++)
{
cin >> magazine[i];
if(hash[magazine[i]]>0)
hash[magazine[i]]++;
else
hash.emplace(magazine[i],1);
}


But when I try to output, all magazine key gives 0 as value. Any idea why?

Answer

Your version doesn't work because this if(hash[magazine[i]]>0) will insert an element into hash if it doesn't exist, this new element will have a mapped value of 01. Which means that hash.emplace(magazine[i],1); is pointless here because there will always be an element at magazine[i] now. Because it's value will be 0 your hash[magazine[i]]++; will never run either because the if will never be true. Leaving you with a map of i elements, all with value 0.

operator[] returns a reference to the mapped value if there is one, if not, it inserts one and then returns that reference1.

Which means that you can factor out the if and just change it to:

for(int i = 0;i <m;i++)
{
   cin >> magazine[i];
   hash[magazine[i]]++;
}

Which basically means : "Get a reference to the mapped value for key magazine[i], if none is found, insert one and give me that one. Increment this reference."

1: If insertion occurs the element is value-initialized. Because your mapped value type is int this will result into the mapped value being 0 after insertion.