欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > map容器练习:使用map容器识别统计单词个数

map容器练习:使用map容器识别统计单词个数

2025/3/18 21:23:28 来源:https://blog.csdn.net/huangyuchi/article/details/146315944  浏览:    关键词:map容器练习:使用map容器识别统计单词个数

题目链接:单词识别_牛客题霸_牛客网 

对map的使用不太熟悉的同学可以参考:超详细介绍map(multimap)的使用-CSDN博客

题目解析

        输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来,次数一样的按照单词小写的字典序排序输出,要求能识别英文单词和句号

        得到单词与其个数,我们会用到map容器。输出要求:个数多的先输出,个数相同按照字典序排序输出

算法分析

        其实具体思路很简单,主要是对于map容器使用的练习

        1.输入一个句子,依次得到单词,并使用map容器记录单词及其个数。

        2.因为map是按照字典序排序的,所以我们需要按照单词个数重新排序,map本身是不支持sort,所以我们将map的数据放入vector中进行排序(pair本身是支持排序的,但是它支持的排序,并不是我们所需要的排序,所以我们要传入仿函数实现自己定义的排序)

        3.排序完成我们输出结果即可

代码实现

#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
using namespace std;struct compare
{bool operator()(const pair<string, int>& a, const pair<string, int>& b){//当个数相同时,按照字典序排序if (a.second == b.second)return a.first < b.first;return a.second > b.second;}
};int main()
{string in;getline(cin, in);//将单词存入数组vector<string> word;string tmp;for (auto& e : in){if (e == ' ' || e == '.'){word.push_back(tmp);tmp.resize(0);}elsetmp += e;}//使用map容器得到单词以及其个数map<string, int> ret;int num = 'a' - 'A';for (auto& r : word){string e = r;if (r[0] >= 'A' && r[0] <= 'Z'){e[0] += num;}ret[e]++;}//放入vector进行排序vector<pair<string, int>> amd;for (auto& e : ret){amd.push_back(e);}sort(amd.begin(), amd.end(), compare());for (auto& e : amd){cout << e.first << ":" << e.second << endl;}
}

优化:可以直接将单词放入map,没必要多先放入vector再放入map

#include<iostream>
#include<map>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;// operator()
struct compare
{bool operator()(const pair<string, int>& a, const pair<string, int>& b){if (a.second == b.second)return a.first < b.first;return a.second > b.second;}
};int main()
{string in;getline(cin,in);string tmp;map<string, int> ret;for (auto& e : in){if (e == '.' || e == ' '){ret[tmp]++;tmp.resize(0);}else{tmp += tolower(e);//大写转小写函数。小写转大写:toupper}}vector<pair<string, int>> n;for (auto& e : ret){n.push_back(e);}sort(n.begin(), n.end(), compare());for (auto& e : n){cout << e.first << ":" << e.second<<endl;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词