map和multimap提供了操作<键,值>对的方法,存储一对对象,即键对象和值对象,键对象是用于查找过程中的键,值是与键对应的附加数据。例如,若键是单词,对应的值是表示单词在文档中出现次数的数字,这样的map就成了统计单词在文本中出现次数的频数表;map中的元素不允许重复,而multimap中的元素允许重复。
虽然set/multiset集合中的元素只包括键,而map映射中的元素则由<键,值>对构成,但map/multimap
提供的操作也是针对各元素中的键进行的,其操作方法与set集合操作键的方法相同。前面介绍的set/multiset集合的操作方法同样适用于map/multimap,包括集合的建立方法,成员函数,比较运算,排序规则和方法等,只需要将其中的set改为map,将multiset更改为multimap。因此,这里只对map/multimap集合的insert成员函数及元素的访问方法作两点补充说明:
(1)关于insert成员函数
插入到map/multimap和set/multiset的元素是有区别的,插入到set/multiset中的元素是单独的键,而插入到map/multimap中的元素是<键,值>对构成的一对数据,这对数据是一个不可分割的整体,需要用make_pair成员函数构造:
make_pair(k,v) //其中k代表键,v代表值
(2)关于map/multimap元素访问
map/multimap类型的迭代器提供了两个数据成员:一个是first,用于访问键;另一个是second,用于访问值。 此外,map类型的映射可以用键作为数组下标,访问该键所对应的值,但multimap类型的映射不允许使用数组下标的方式访问其中的元素。
关于map的简例:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string name[]={"花木兰","澜","上官婉儿"};
string pos[]={"战士","刺客","法师"};
map<string,string,greater<string>> wzry; //默认的话就是less
map<string,string>::iterator p;
for(int i=0;i<3;i++)
wzry.insert(make_pair(name[i],pos[i]));
wzry["牛魔"]="坦克";
wzry["吕布"]="战士";
for(p=wzry.begin();p!=wzry.end();p++)
cout<<p->first<<" "<<p->second<<endl;
string person;
cout<<"输入查找英雄的姓名:";
cin>>person;
for(p=wzry.begin();p!=wzry.end();p++)
if(p->first==person)
cout<<p->second<<endl;
return 0;
}
输出结果:
上官婉儿 法师
牛魔 坦克
吕布 战士
澜 刺客
花木兰 战士
输入查找英雄的姓名:花木兰
战士
multimap和map的用法基本相同,区别在于,map映射中的键不允许重复,而multimap中的键是允许重复的。此外,map允许用数组的下标运算访问映射中的值,而multimap是不允许的,multimap在构造一键对多值的查询时非常有用。
关于multimap的简例:
#include<bits/stdc++.h>
using namespace std;
int main()
{
multimap<string,string> dict;
multimap<string,string>::iterator p;
string eng[]={"cliff","berg","precipice","tract"};
string che[]={"悬崖","冰山","悬崖","一片,区域"};
for(int i=0;i<4;i++)
dict.insert(make_pair(eng[i],che[i]));
//插入单个元素
dict.insert(make_pair(string("tract"),string("地带")));
dict.insert(make_pair(string("precipice"),string("危险的处境")));
dict.insert(make_pair("day","一天")); //正确
//dict["precipice"]="悬崖,峭壁"; 错误
for(p=dict.begin();p!=dict.end();p++)
cout<<p->first<<" "<<p->second<<endl;
string word;
cout<<"请输入要查找的英文单词: ";
cin>>word;
for(p=dict.begin();p!=dict.end();p++)
if(p->second==word)
cout<<p->first<<endl;
return 0;
}
输出结果:
berg 冰山
cliff 悬崖
day 一天
precipice 悬崖
precipice 危险的处境
tract 一片,区域
tract 地带
请输入要查找的英文单词: 悬崖
cliff
precipice
HDU 1263
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;cin>>n;
while(n--)
{
int m,k; cin>>m;
string s1,s2;
map<string,map<string,int>> p; //第一个string是s2,第二个string是s1
map<string,int> q;
for(int i=0;i<m;i++)
{
cin>>s1>>s2>>k;
p[s2][s1]+=k;
}
for(auto it:p)
{
cout<<it.first<<endl;
q=it.second;
for(auto itt:q)
{
cout<<" |----"<<itt.first<<"("<<itt.second<<")"<<endl;
}
}
}
return 0;
}