http://acm.hdu.edu.cn/showproblem.php?pid=1263
水果
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1528 Accepted Submission(s): 608
Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了.
每组测试数据的第一行是一个整数M(0<M<=100),表示工有M次成功的交易.其后有M行数据,每行表示一次交易,由水果名称(小写字母组成,长度不超过80),水果产地(小写字母组成,长度不超过80)和交易的水果数目(正整数,不超过100)组成.
两组测试数据之间有一个空行.最后一组测试数据之后没有空行.
1 #include<iostream> 2 #include<map> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 int t,n; 8 int count; 9 string fruit,address; 10 cin>>t; 11 while(t--) 12 { 13 map<string,map<string,int> >mm; 14 map<string,map<string,int> >::iterator itw; 15 map<string,int>::iterator itn; 16 cin>>n; 17 while(n--) 18 { 19 cin>>fruit>>address>>count; 20 21 mm[address][fruit]+=count; 22 } 23 for(itw=mm.begin();itw!=mm.end();itw++) 24 { 25 cout<<itw->first<<endl; 26 for(itn=itw->second.begin();itn!=itw->second.end();itn++) 27 { 28 cout<<" |----"<<itn->first<<"("<<itn->second<<")"<<endl; 29 } 30 } 31 if(t!=0) cout<<endl; 32 33 } 34 }
map嵌套一些知识:
STL中map的嵌套使用
对于传统的map,我们只需要:
#include<map>
#include<iostream>
int main()
{
map<int, string> scores;
scores.insert(make_pair(100,"maxi"));
scores[100]="MAXI";
scores.insert(make_pair(300,"xiaoyu"));
scores.insert(make_pair(300,"xiao"));
scores[200]="xiaoma";
map<int,string>::iterator pScores;
for(pScores=scores.begin();pScores!=scores.end();pScores++)
{
std::cout<<pScores->first<<" "<<pScores->second<<endl;
}
return 0;}
结果输出:
100 MAXI
200 xiaoma
300 xiaoyu
由此可以看出,scores[100]="MAXI"会直接替换掉原来100map对应的value,而如果调用scores.insert()函数,则由于本map是单映射的,
但如果我想定义嵌套的map并对它进行遍历,该如何进行呢:
#include<map>
#include<iostream>
int main()
{
map<int,map<int,string> >multiMap; //对于这样的map嵌套定义,有两种插入方法:
map<int, string> temp; //定义一个map<int, string>变量,对其定义后在插入multiMap
temp.insert(make_pair(90,"hi"));
temp.insert(pair<int,string>(100,"maxi)); //pair<int,string>()和make_pair()有相同作用
multiMap.insert(make_pair(10, temp)); //将临时变量插入到multiMap中
multiMap[10][80]="xiaoyu"; //可以直接赋值
mulitMap[5][30]="xiaoma";
map<int,map<int,string> >::iterator multitr; // 以下是如何遍历本multiMap
map<int,string>::iterator intertr;
for(multitr=multiMap.begin();multitr!=multiMap.end();multitr++)
{
for(intertr= multitr ->second.begin(); intertr != multitr ->second.end(); intertr ++)
std::cout<< multitr ->first<<" "<<intertr->first<<" ("<< intertr -> second <<")"<<endl;
}
return 0;
}
运行结果如下:
5 30 (xiaoma)
10 80 (xiaoyu)
10 90 (hi)
10 100 (maxi)
总结,map的成员加入有两种赋值方法,一种是调用map.insert()函数,这样,由于是单映射,后面加入的新的pair对如果有key值和前面一样,那么后面的pair对元素将不会被加入到map中;但如果是直接[ ]=赋值操作的话,相当于数组赋值,会直接替换掉原来具有相同key域的pair对。