2017-10-09 66 views
0

我有以下問題 - 我想要計算文件中每個單詞的出現次數。我使用的是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 ::地圖<字符串,std :: size_t>'和'wordmap [word] ++;'? – NathanOliver

+0

@NathanOliver我正在做一些練習,我必須用'insert()'來完成。無論如何,下面的答案對我來說很清楚。 – yooo123

+0

如果該值已經存在,'insert'不會插入任何內容。 –

回答

2

的問題是,我想用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