计算每个不同单词在其输入 C++ 中出现的次数
Posted
技术标签:
【中文标题】计算每个不同单词在其输入 C++ 中出现的次数【英文标题】:Count how many times each distinct word appears in its input C++ 【发布时间】:2011-03-19 17:22:48 【问题描述】:#include <iostream>
#include <string>
#include <sstream>
#include <map>
int main()
std::string input;
std::cout << "Enter input: ";
std::getline(std::cin, input);
std::map<std::string, int> m;
std::map<std::string, int>::iterator it;
std::istringstream iss(input);
std::string words;
do
iss >> words;
it = m.find(words);
if(it != m.end())
m.insert(it, std::pair<std::string, int>(words, m[words] + 1));
else
m.insert(std::pair<std::string, int>(words, 1));
while(iss);
for(std::map<std::string, int>::iterator it = m.begin(); it != m.end(); ++it)
std::cout << it->first << " - " << it->second << std::endl;
return 0;
问题是它为每个单词打印 1,即使它出现两次。可能是什么问题呢?我不确定我对不为空的迭代器的测试是否正确。
【问题讨论】:
***.com/questions/4888879/… 您还可以在此处查看其他解决方案:Elegant ways to count the frequency of words in a file 【参考方案1】:因为map
会自动用默认构造函数构造一个item,所以当你访问一个还不存在的key时,你可以简单地说:
while (iss >> words)
++m[words];
新项目的默认值为 0(请参阅this question)。
您之前的地图逻辑很好,只是您的条件颠倒了;它应该是if (it == m.end())
而不是!=
,因为find()
在未 找到元素时返回end()
。正如 GWW 在他的回答中指出的那样,当物品已经在地图中时,insert
无效,这是您唯一一次使用它。
另外,您的循环没有正确处理输入;您需要检查流的状态是否在读取值之后无效,但在使用它之前之前(因为如果流在其末尾,则该值是垃圾) .处理输入的惯用方式是使用while (is >> value)
构造;如果你想自己做,那么这是等价的:
while (true)
iss >> words;
if (!iss)
break;
// Process words...
最后,当变量一次只包含一个单词时,将其命名为“单词”有点误导 ;-)
【讨论】:
【参考方案2】:我会引用cplusplus.com。
因为地图容器不允许 对于重复的键值, 插入操作检查每个 元素插入是否另一个 元素已经存在于 具有相同键值的容器,如果 所以,元素没有被插入并且 它的映射值在任何情况下都不会改变 方式。
在您的代码中,您试图在地图中已有的元素之上插入。你应该改变
m.insert(it, std::pair<std::string, int>(words, m[words] + 1));
到
it->second+=1;
【讨论】:
以上是关于计算每个不同单词在其输入 C++ 中出现的次数的主要内容,如果未能解决你的问题,请参考以下文章
华为OD机试 2023最新 字符串重新排列字符串重新排序(C++ 100%)