计算每个不同单词在其输入 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 &gt;&gt; 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%)

计算特定单词在 C++ 文本文件中出现的次数

统计指定字符串中每个单词出现的次数(C++)

统计指定字符串中每个单词出现的次数(C++)

华为机试真题 C++ 实现字符串重新排列2022.11 Q4新题

华为机试真题 C++ 实现字符串重新排列2022.11 Q4新题