一道map例题

时间:2022-12-29 14:07:57

一、题目

小明的一位同学是学霸,他的家中有很多藏书,真可谓汗牛充栋。小明想考一考学霸,给学霸出了一道难题。小明问这么多书籍,到底有多少本不一样的书,每样书的名字是什么?(因为有的书名是一样的,所以我们把它们视为同样的书)学霸就是学霸,张口就说出了答案。不知道你是否也是学霸?一起来挑战下!

输入格式

第一行是书籍总量n(1<=n<=1e6)。然后有n行书名(书名是一个英文字符串,字符串的长度小于100,中间没有空格)。

输出格式

第一行是不同书籍的数量,然后按照书名的字典序输出书名和数量

样例输入

4
English
maths
Chinese
Chinese

样例输出

3
chinese 2
english 1
math 1

二、解题思路

为何会想到用map映射解决这道题?

主要是看到输出格式中按照书名的字典顺序输出,如果不用映射输出(映射自带有排序功能,string类型的变量会按照字母顺序来输出),很难再想出输出会按照字母顺序输出。

敲代码时,需要注意

1、在输入输出过多时,不宜用cin cout进行输入输出,很容易超时,应该改用C语言正常使用的printf 和scanf进行输入和输出

2、使用map、set等stl库时,千万不要忘了头文件,和using namespace std;

3、使用map(string,int) a时,直接a[string]++,因为在int类型value没有初始化时,默认值就是0。


三、代码及注释

#include<map>
#include<string>
#include<utility>
using namespace std;
int main()
{
int n;
string name;//不能忘记头文件string
cin >> n;
map<string, int> a;//不能忘记头文件<map>
for (int i=0;i<n;i++)
{
cin >> name;
a[name]++;//此时并没有对key的value进行初始化,但int类型默认是0!方便许多
}
cout << a.size()<<endl;
for (map<string, int>::iterator it = a.begin(); it != a.end(); it++)
{
cout << it->first << " " << it->second << endl;//满足题目要求,按照first的字母进行排序输出
}
return 0;
}

一道map例题