发布时间:2022-12-16 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

关联容器

无序关联容器->链式哈希表 增删查 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) 当处理海量数据查重复,去重复的时候,常常会用到它,简单应用如下图

<六>无序关联容器