关联容器底层数据结构:unordered_map/set基于hash表,不保证插入顺序;map/set基于红黑树,根据键自动排序

关联容器中的元素是按关键字来保存和访问的,支持高效的关键字查找与访问。

1、map类容器:
map容器中的元素是一些键-值(key-value)对:键起到索引的作用,值则表示与索引相关联的数据。
map关联容器的类型:

  • map :基于红黑树的关联数组;保存键-值对;数据的存放是按键自动排序后进行
  • multimap:关键字可以重复出现的map
  • unordered_map:用哈希函数组织的map,容器中的数据存放是无序的,不保证与插入顺序一致
  • unordered_multimap:哈希组织的map;关键字可以重复出现
map<string, int> val1;
map<string, int> val2 = {
    
    {
    
    "111",1},{
    
    "222",4}};
map<string, int> val3 = val2 ;
auto ptr = val3.find("111"); // 返回的是迭代器类型
val["234"] = 4; // 最常用的插入方式
val3.insert(pair<string,int>("123",3)); // 插入的方式
val3.erase(ptr); // 删除的方法1
val3.erase("123"); // 删除的方法2

注:由于map是不包含重复关键字的,因此重复插入一个已存在的关键字元素并不会添加到map容器中。map容器中存储的关键字对应的值还是第一次添加到容器中关键字对应的值

2、set类容器:
set容器中的每个元素只包含一个关键字,可以这么认为,其实set就是一个集合,用来存储同类型的元素。
set关联容器的类型:

  • set : 关键字即值,即只保存关键字的容器 ,底层数据结构为红黑树,有序,不重复;
  • multiset : 底层数据结构为红黑树,有序,可重复。
  • unordered_set: 无序的set
  • unordered_multiset: 关键字可以重复出现的无序的set
set<string> a1={
    
    "fengxin","666"};
set<string> a2=a1;
set<string> a;  //empty set
a.insert("123");  // 插入一个元素
a.erase("123");    //删除关键字为123的元素
int numb = a.count("123"); // 返回0表示没有
auto ptr = val3.find("fengxin"); // 返回的是迭代器类型,不是val3.end()则表明存在

注:unordered:底层由哈希表(哈希桶算法)来实现,如无该关键字,则底层是由红黑树来实现。

为什么要使用unordered_map代替hash_map?
因为标准化的推进,unordered_map原来属于boost分支和std::tr1中,而hash_map属于非标准容器。
另外,使用之后,感觉速度和hash_map差不多,但是支持string做key,也可以使用复杂的对象作为key。

参考资料:c++关联容器总结

总结:

1、unordered_map/set底层数据结构基于hash表,因此插入顺序与容器中的顺序不一致,若像保持插入顺序与容器中顺序一致需要使用链表list<pair<int,int>> container,或用链表list保存键,同时利用map保持对应的值。
2、map/set底层数据结构基于红黑树,根据键会自动排序。

猜你喜欢

转载自blog.csdn.net/qq_33726635/article/details/106553317