杭电1004
Let the Balloon Rise
Description
在ACM比赛中,你每解决一道题,你就可以获得一个气球,不同颜色的气球代表你解决了不同的问题。在WJL同学参加的一场ACM比赛中,他发现场面上有N个气球,并熟练的说出了气球的颜色。
请你编写一个程序,找出气球数量最多的颜色。
Input
有多组样例输入。
每组样例第一行输入一个整数N (0 < N <= 1000) ,代表一共有N个气球。若N=0,则代表输入结束,你不需要输出任何信息。
接下来N行每行输入一个不多于15个字母的字符串代表颜色。
Output
对于每组样例数据,在单独的一行内输出数量最多的那种颜色的气球。(数据保证输出是唯一的)
Sample Input
5
green
red
blue
red
red
3
pink
orange
pink
0
Sample Output
red
pink
#include<stdio.h>
#include<map>
#include<string>
#include<iostream>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)&&n){
map<string,int>ma;
map<string,int>::iterator x;
map<string,int>::iterator y;
for(int i=0;i<n;i++){
char str[20];
scanf("%s",str);
x=ma.find(str);//使用find,返回的是被查找元素的位置,没有则返回ma.end(),第一次是肯定没有的,所以下面用pair添上
if(x==ma.end()) ma.insert(pair<string,int>(str,1));
else ma[str]++; //str是key,ma[key]返回的是value,但不能写成ma[value],这样写也不会返回key
}
int max=0;
for(x=ma.begin();x!=ma.end();x++){
if(x->second>=max){ //x->second,这里的second代表value,整体表示value
max=x->second;
y=x;
}
}
cout<<y->first<<endl;//这里的first代表key,别忘记#include<iostream>
}
return 0;
}
Pair类型(里面有两个数据成员的类)
pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下:
pair<int, string> a;
表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。
pair<string, string> a("James", "Joy");
也可以像上面一样在定义的时候直接对其初始化。
由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:
typedef pair<string, string> author;
author pro("May", "Lily");
author joye("James", "Joyce");
Pair对象的操作
-
对于pair类,由于它只有两个元素,分别名为first和second,因此直接使用普通的点操作符即可访问其成员
pair<string, string> a("Lily", "Poly");
string name;
name = pair.second;
- 生成新的pair对象
可以使用make_pair对已存在的两个数据构造一个新的pair类型:
int a = 8;
string m = "James";
pair<int, string> newone;
newone = make_pair(a, m);
两个pairs互相比较时, 第一个元素正具有较高的优先级.
例:
using namespace std{
template <class T1, class T2>
bool operator< (const pair<T1, T2>&x, const pair<T1, T2>&y){
return x.first<y.first || ((y.first<x.first)&&x.second<y.second);
}
}
make_pair():
无需写出型别, 就可以生成一个pair对象
例:
std::make_pair(42, '@');
而不必费力写成:
std::pair<int, char>(42, '@')
当有必要对一个接受pair参数的函数传递两个值时, make_pair()尤其显得方便,
void f(pair<int, const char*>);
void foo{
f(make_pair(42, '@')); //pass two values as pair
}
很明显,我们可以使用pair的构造函数也可以使用make_pair来生成我们需要的pair。 一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象很方便,代码也很清晰。 另一个使用的方面就是pair可以接受隐式的类型转换,这样可以获得更高的灵活度。灵活度也带来了一些问题如:
pair<int, float>(1, 1.1);
make_pair(1, 1.1);
是不同的,第一个就是float,而第2个会自己匹配成double。