问题描述:
//对文中内容单词数量进行统计排序输出,统计时不区分大小写,只统计出现次数大于3的单词,并按降序排列输出,
//仅提供cpp内容在答案中。(前10名加分)
//例如输入一段英文
//输入:This is a gorup of …………………….
//输出:
is 5
of 4
group 4
话不多说:先上代码
#include<iostream>
#include<sstream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
//通过STL的transform算法配合的toupper和tolower来实现该功能,只针对26个英文字母,其余的不会改变。
//输入的字符串中只考虑了空格这一种特殊字符,没有考虑其它特殊字符
int main()
{
string str;
getline(cin, str);
transform(str.begin(), str.end(), str.begin(), ::tolower);//将大写全部转换为小写
stringstream ss(str);
map<string, int> m;
map<string, int>::iterator it;
pair<map<string, int>::iterator, bool> flag;
while (ss >> str) //以空格为分隔符读入每一个单词
{
flag = m.insert(pair<string, int>(str, 1));
if ( ! flag.second)
{
it = m.find(str);
it->second++; //出现相同单词value值+1
}
}
multimap<int, string>m1;
for (it = m.begin(); it != m.end(); it++)
{
m1.insert(make_pair(it->second, it->first)); //将m中的单词转存到m1中,方便按value值排序
}
for (multimap<int,string>::iterator iter = --m1.end();iter != --m1.begin(); iter--) //降序输出
if(iter->first>3)
cout << iter->second << " " << iter->first<< endl;
return 0;
}
使用getline函数实现带有空格字符串的输入;
使用transform实现大小写字母的转换,注意,使用此方法是,需要包含algorithm头文件
使用map容器实现对每一个单词的存入,但是这里有一个问题,map容器是按key自动排序的,我们要是想按单词出现的次数进行排序,可以另外定义一个multimap容器将之前存的位置颠倒,例如
map<string,int>换成multimap<int,string>;这样就能实现按value值排序。
题目还有一个要求是实现降序输出,我们可以在循环遍历时,想让iter指向容器最后一个元素,然后iter–,这样就能实现降序输出。
版权声明:本文为weixin_43929310原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。