<六>无序关联容器
关联容器
无序关联容器->链式哈希表 增删查 O(1)
set:集合key map:映射表[key,value]
unordered_set 单重集合 不允许重复
unordered_multiset 多重集合
unordered_map 单重映射表
unordered_multimap 多重映射表
有序关联容器=》红黑树 增删查O(log2N)
set
multiset
map
multimap
unordered_set<int> set1
for(int i=0;i<50;i++){
set1.insert(i);
}
for(int m=0;m<50;m++){
set1.insert(m);
}
cout<<se1.size()<<endl;//容器个数, unordered_set<int> 不允许重复值
cout<<set1.count(5)<<endl;//值为5的个数
auto it1=set1.begin();
for(;it1!=set1.end();++it1){
cout<<*it1<<endl;
}
set1.erase(10);//删除10的元素,如果连续的删除 要记得更新迭代器
it1=set1.find(20);
for(int x : set1){
cout<<x<<endl;
}
unordered_map [key,value]=>打包成 pair
unordered_map<int,string> map1;//不允许重复
map1.insert(make_pair(100,"AAA"));
map1.insert({200,"bbb"});
map1.insert({200,"ccc"});//key 重复了,不会被插进去
cout<<map1.size()<<endl;//包含键值对的个数
cout<<map1[100]<<endl;//map 提供了[]的重载函数来查询,
**注意:**map1[555] 使用中括号来查询会有一个问题,如果key不存在,那么555这个键值会被插入到map中,valu的值会用一个默认值!!!
operator[]会返回插入值得引用,如下
value & operator[](const K key){
return map.insert[key,string()];
}
所以 map1[999]="ABAB"; 由于999不存在,相当于[999,"ABAB"]被插到map里了
而 map1[100]="MMM"; 由于100key 值存在,相当于 把100的value值给修改了
map1.erase(100);//删除Key=100的
auto it1 =map1.find(200);
if(it1!=map1.end()){
cout<<it1->first<<"="<<it1->second<<endl;
}
unordered_map 由于增删查时间是O(1) 当处理海量数据查重复,去重复的时候,常常会用到它,简单应用如下图