我有以下问题 - 我想计算文件中每个单词的出现次数。我正在使用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;
}
答案 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));
}