简介:
map就是从键(key)到值(value)的映射。因为重载了[]运算符,map像是数组的“高级版”。例如可以用一个map<string,int>month name来表示“月份名字和月份编号”的映射,然后可以用month_name[July]=7这样的方式来赋值。
例题 反片语(Ananagrams)
输入一些单词,找出满足如下条件的单词:该单词不能通过字母重排,得到文本中的另一个单词。在判断是否满足条件时,字母不分大小写,但在输出是应保留输入中的大小写,按字典序进行排序(所有大写字母在所有小写字母的前面)。
样例输入:
ladder came tape soon leader acme RIDE lone Dreis peat
ScAlE orb eye Rides dealer NotE derail LaCes drIed noel dire Disk mace Rob dries
样例输出:
Disk NotE derail drIed eye ladder soon
编码的思考过程:
1.写一个标准化函数(实现大写字母转哈维小写字母),单词排序,注意使用const是为了不改变s的初值;
2.两个vector容器(words,ans)一个map容器
words存储所有的单词
map存储便准化后对应单词以及出现的次数的值,相当于一个表格;
words经过查表map,把对应的符合值给ans;
3.输出
#include<iostream>
#include<string>
#include<cctype>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<string,int> cnt;
vector<string> words;
// 将单词s进行“标准化”
string repr(string s) {
string ans = s;
for(int i = 0; i < ans.length(); i++)
ans[i] = tolower(ans[i]);//towler是一种函数,功能是把字母字符转换成小写,非字母字符不做处理
sort(ans.begin(), ans.end());
return ans;
}
int main() {
int n = 0;
string s;
while(cin >> s) {
if(s[0] == '#') break;
words.push_back(s);//输入的单词添加到尾部
string r = repr(s);//得到标准化之后的s
if(!cnt.count(r)) cnt[r] = 0;//使用count,返回的是被查元素的个数。如果有,返回1,否则返回0
cnt[r]++;
}
vector<string> ans;
for(int i = 0; i < words.size(); i++)
if(cnt[repr(words[i])] == 1) ans.push_back(words[i]);//如果单词不重复就放入长数组ans的尾部
sort(ans.begin(), ans.end());//对ans内的所有单词元素排序后输出
for(int i = 0; i < ans.size(); i++)
cout << ans[i] << "\n";
return 0;
}
分析:
如果没有良好的代码设计,是无法发挥STL的威力的。如果没有想到“标准化”这个思路,就很难用map简化代码
提示:
set头文件中的set和map头文件中的map分别是集合和映射。两者都支持insert、find、和remove操作,并且可以按照从大到小的顺序循环遍历其中的元素。map还提供了“[]”运算符,使得map可以像数组一样使用。事实上,map也称为“关联数组”。