关联容器
STL中常用的关联容器有四种:set、map、mutimap、multiset。这四种容器中的元素都是按照键有序排列的,因此关联容器的键值必须是可比较的。
- 如果键值是基本类型可以直接使用,如果键值是自定义类型,需要定义带有比较谓词的构造函数
- map中保存着一系列的键值对儿,每个键对应一个值,键类似有索引的功能,具有唯一性,值表示该键关联的数据。
- 字典是一个典型的map,每个单词相当于一个键,对应的释义相当于键值
- set跟map的区别是,set中每个元素只包含一个键,该键同样具有唯一性
- 例如,可以使用set保存班级内男同学的学号(不需要知道学号对应的姓名)
- multiset和multimap与set和map的区别在于,其可以有重复的键,例如一个身份证号对应多张银行卡
- set和map的访问非常高效,可以达到对数的级别,效率上的优势是通过红黑树这种复杂的数据结构保证的
真题:set和map配合使用的例子
/*
开户信息1234567890987654321,前9位为身份信息,身份信息前3位为城市信息,后10位为账户信息。现在需要输出所有开户信息覆盖的城市信息,以及开户超过两个的身份信息
*/
void statistic(vector<string>&acc,set<string> &city,map<string,int> &people){
for(auto it = acc.begin();it !=acc.end();it++){
string uid =(*it).substr(0,18);
city.insert(uid.substr(0,3));
people[(*it).substr(0,18)]++;
}
for(auto it = city.begin();it!=city.end();it++){
cout<< *it <<endl;
}
map<string,int>::iterator it = people.begin();
while(it != peoplr.end()){
if((*it).second<2){
people.erase((*it++).first)
}else{
cout<<(*it).first<<" : "<<(*it).second<<endl;
it++;
}
}
}