参考:https://blog.csdn.net/fengxinlinux/article/details/73718859
关联容器(map类和set类)中的元素是按关键字来保存和访问的,支持高效的关键字查找与访问。
1. map类:map容器中的元素是一些键-值(key-value)对:键起到索引的作用,值则表示与索引相关联的数据。
map关联容器的类型:
- map :基于红黑树的关联数组;保存键-值对;数据的存放是按键自动排序后进行
- multimap:关键字可以重复出现的map
- unordered_map:用哈希函数组织的map,容器中的数据存放是无序的,不保证与插入顺序一致
- unordered_multimap:哈希组织的map;关键字可以重复出现
- 注:由于map是不包含重复关键字的,因此重复插入一个已存在的关键字元素并不会添加到map容器中。map容器中存储的关键字对应的值还是第一次添加到容器中关键字对应的值。但是可以通过键值来修改。
map<string, int> m1;
map<string, int> m2 = {{"a",1},{"b",2}};
map<string, int> m3 = m2 ;
auto ptr = m3.find("a"); // 返回的是迭代器类型
m3["b"] = 2; // 最常用的插入方式
m3.insert(pair<string,int>("c",3)); // 插入的方式
m3.erase(ptr); // 删除的方法1
m3.erase("c"); // 删除的方法2
2、set类容器:set容器中的每个元素只包含一个关键字,可以认为set就是一个集合,用来存储同类型的元素。
set关联容器的类型:
- set : 关键字即值,即只保存关键字的容器 ,底层数据结构为红黑树,有序,不重复;
- multiset : 底层数据结构为红黑树,有序,可重复。
- unordered_set: 无序的set,底层数据结构为哈希表
- unordered_multiset: 关键字可以重复出现的无序的set,底层数据结构为哈希表
-
注:unordered:底层由哈希表(哈希桶算法)来实现,如无该关键字,则底层是由红黑树来实现。
-
使用unordered_map代替hash_map是因为标准化的推进,unordered_map原来属于boost分支和std::tr1中,而hash_map属于非标准容器。另外,使用之后,感觉速度和hash_map差不多,但是支持string做key,也可以使用复杂的对象作为key。
set<string> a1={"1","2"};
auto ptr = a1.find("1"); // 返回的是迭代器类型,不是a1.end()则表明存在
set<string> a2=a1;
auto ptr = a2.find("2"); // 返回的是迭代器类型,不是a2.end()则表明存在
set<string> a3; // empty set
a3.insert("3"); // 插入一个元素
a3.erase("3"); // 删除关键字为3的元素
int numb = a3.count("3"); // 返回0表示没有
总结:
- unordered_map、unordered_set底层数据结构基于hash表,因此插入顺序与容器中的顺序不一致,若想保持插入顺序与容器中顺序一致,需要使用链表
list<pair<int,int>> container
,或用链表list保存键,同时利用map保持对应的值。 - map、set底层数据结构基于红黑树,根据键会自动排序。