使用insert c ++递增map中的值

时间:2017-10-09 12:15:19

标签: c++ dictionary insert

我有以下问题 - 我想计算文件中每个单词的出现次数。我正在使用map<string,Count>,因此键是表示单词的字符串对象,正在查找的值是保持字符串计数的对象,以便:

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;
}

2 个答案:

答案 0 :(得分:3)

您可以重构以便不使用find而是简单地尝试插入吗?

插入始终返回pair<iter*, bool>。如果找到密钥,则布尔值为0,并且iter *指向现有对。因此,我们可以将指针指向该对并增加值:

// On successful insertion, we get a count of 1 for that word:
auto result_pair = wordmap.insert( { word, 1 } );
// Increment the count if the word is already there: 
if (!result_pair.second)
    result_pair.first->second++;

这是我第一次发帖。我正在学习C ++,欢迎就我的想法提供反馈。

答案 1 :(得分: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)); 
}