map映射:
map和python中的字典类似,map所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素会被视为键值,第二个元素会被视为实值。map不允许两个元素拥有相同的键值。
使用方法:
声明:使用头文件#include<map>,map<int,string>Map;
插入元素:
Map.insert(pair<int, string>(
1
,
"zh"
));
Map[10]="ch"; Map[3]="bh"; //这里的[ ]被重载了
迭代器遍历:
#include<iostream> #include<string> #include<map> using namespace std; int main() { map<int,string>cnt; cnt[2]="zhan"; cnt[5]="n"; cnt[1]="v"; for(map<int,string>::iterator i=cnt.begin();i!=cnt.end();++i) { cout<<i->first<<" "<<i->second<<endl; } } 运行结果: 1 v 2 zhan 5 n #键值会自动排序
例题:反片语(UVa 156)
输入一些单词,找出所有满足如下条件的单词:
该单词不能通过字母重排,得到输入文本中的另外一个单词。
在判断是否满足条件时,不区分大小写,但输出保留输入中的大小写,按字典序进行排列(所有大写字母在小写字母的前面)
样例输入:
ladder came tape soon leader acme RIDE lone Dreis peat
ScALE orb eye Rides dealer NotE derail LaCeS drIed
noel dire Disk mace Rob dires
#
样例输出:
Disk
NotE
derail
drIed
eye
ladder
soon
思路:这道题分为两步走:先找再排。找的途中不需要区分大小写,所以需要统一转换成大写或小写,并标准化成单词已经排好序的形式,如hello变成了ehllo。下一步输出时仍要输出原来的格式,即保留大小写。map在其中的作用就是将单词与它标准化后出现的次数对应起来。
#include<iostream>
#include<string>
#include<cctype>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<string,int>cnt;
vector<string>words;
string repr(const string & s) //将单词s进行标准化
{
string ans=s;
for(int i=0;i<ans.length();i++)
ans[i]=tolower(ans[i]);
sort(ans.begin(),ans.end()); //sort可以对任意对象进行排序
return ans;
}
int main()
{
int n=0;
string s;
while(cin>>s){
if(s[0]=='#')break;
words.push_back(s); //在vector words尾部加入一个数据s
string r=repr(s); //r为标准化后的字符串
if(!cnt.count(r))cnt[r]=0; //count(n) 返回容器中n出现的次数 若为0,则将r存入容器中,并初始个数为0
cnt[r]++; //r对应的int个数 加一 ,该值即为r出现的次数
}
vector<string>ans;
for(int i=0;i<words.size();i++)
if(cnt[repr(words[i])]==1)ans.push_back(words[i]);
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++)cout<<ans[i]<<endl;
//system("pause");
return 0;
}