使用插入增加地图中的值C++

问题描述:

我有以下问题 - 我想要计算文件中每个单词的出现次数。我使用的是map<string,Count>所以关键是代表字的字符串对象,并正在抬头的价值在于保持弦数,因此对象:使用插入增加地图中的值C++

class Count { 
    int i; 
public: 
    Count() : i(0) {} 
    void operator++(int) { i++; } // Post-increment 
    int& val() { return i; } 
}; 

的问题是,我想用insert()而不是operator[]。这是代码。

typedef map<string, Count> WordMap; 
typedef WordMap::iterator WMIter; 

int main() { 

    ifstream in("D://C++ projects//ReadF.txt"); 

    WordMap wordmap; 
    string word; 
    WMIter it; 
    while (in >> word){ 
     // wordmap[word]++; // not that way 

     if((it= wordmap.find(word)) != wordmap.end()){ //if the word already exists 
     wordmap.insert(make_pair(word, (*it).second++); // how do I increment the value ? 
     }else{ 
      ... 
     } 

    for (WMIter w = wordmap.begin(); 
     w != wordmap.end(); w++) 
     cout << (*w).first << ": " 
     << (*w).second.val() << endl; 
} 
+0

这有什么错用'的std ::地图'和'wordmap [word] ++;'? – NathanOliver

+0

@NathanOliver我正在做一些练习,我必须用'insert()'来完成。无论如何,下面的答案对我来说很清楚。 – yooo123

+0

如果该值已经存在,'insert'不会插入任何内容。 –

的问题是,我想用insert()代替operator[]

...为什么? std::map::insert不能改变现有的值。 operator[]是正确的工作。

如果你真的想使用insert(请不要),你首先需要erase现有的值,如果存在的话:

if((it= wordmap.find(word)) != wordmap.end()) 
{ 
    const auto curr = it->second; // current number of occurrences 
    wordmap.erase(word); 
    wordmap.insert(make_pair(word, curr + 1)); 
} 
+0

可以用C++ 17看起来更漂亮:if(auto it = wordmap.find ); it!= wordmap.end()){...}' – lisyarus