『写在前面的一些基础语法』
1.定义 和 赋值
- map<int,string> a; 1. a.insert(make_pair(233,"a")); 2. a[2]="b";
- map<char,int> b;
- map<int,char> c;
- 关于两种赋值用法的区别:
¤用insert函数插入数据,在数据的插入上涉及到map关键字的唯一性这个概念。即当map中有这个关键字时,insert操作无效的。
¤用数组方式它可以覆盖以前该关键字对应的值。
(盗一手昆哥的图)
2.Map的特性
- 所有元素都会根据元素的减值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素会被视为键值,第二个元素会被视为实值。map不允许两个元素拥有相同的键值
- 输出
¨输出it->first对应的关键字key
¨ 输出it->second对应的为其value。
3.一些基础的操作(和set完全一致)
所有操作都是根据key来操作改变value, x 皆为 key
- a.insert(x) //插入一个元素x,若重则忽略
- 迭代器(iterator):
a.end();//返回的迭代器指向最后一个元素的后一个位置;
a.begin();//¨返回的迭代器指向 map 中的最小key值;
a.rend;//¨() 返回指向map中第一个元素的反向迭代器;
a.rbegin();//返回的迭代器指向 map 中的最大key值;
- a.size();//成员的个数
- a.empty();//检查map是否为空
- a.clear();//清空map所有元素
- a.erase(x);//删除元素x
- a.find(x);//¨返回 x 元素的迭代器,如果找不到 x 就返回 end() 的 迭代器
- a.count(x);//统计元素x在map出现的次数(不常用)
- a.lower_bound(x) //返回 map中大于等于 x 的最小元素的迭代器
- a.upper_bound(x) //返回 map 中大于 x 的最小元素的迭代器。 如果找不到也会返回 end() 的迭代器
4.又一个双胞胎
¨Multimap:
1.与map不同的是它允许重复键。即一个关键词可以有很多不同的值。这些值按插入的时间顺序排列。
2.没有定义[]运算符,只能利用insert()函数进行插入。
3.¨使用find(x)查找返回每种关键词的所有元素的第一个元素的迭代器。
4.equal_range(x)返回一对iterator的pair,表示关键词x的位置的区间(左闭右开)
『上题上题』
【反片语】(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
『代码代码』
#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){
string ans=s;
for(int i=0;i < ans.length();i++)
ans[i] = tolower(ans[i]);
sort(ans.begin(),ans.end());
return ans;
}
int main(){
int n;
string s;
while(cin>>s){
if(s[0] == '#') break;
words.push_back(s);//将每个单词s压到words中
string r = repr(s);//将单词s中字母全"标准化"
if(!cnt.count(r)) cnt[r] = 0;//统计单词r的个数 如果该单词不存在 将r存在map中,并将个数初始化为0
cnt[r]++;//统计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());//将单词排序后输出
for(int i =0;i < ans.size(); i++)
cout<<ans[i] << "\n";
return 0;
}
}