STL中map和set

C++11才开始支持括号初始化!!!

关于STL中的map和set

首先来看一下关联容器吧

关联容器迭代器:map的value_type是pair<const key_type, mapped_type>,所以map迭代器只能改变关键字映射的值(mapped_type),不能修改关键字;set的value_type等于key_type,都是const关键字,不能修改。

关于其中的几点性质:

1.map使用键值对的方式来储存数据,键不能有重复的,值可以重复,map使用键来存储数据,系统会根据键来自动将数据排序;set键不能有重复,使用键来存储数据,系统会根据该值来自动将数据排序

2.C++STL中map,set的底层实现全是用的红黑树,而且关键字都不能重复,而multimap和multiset关键字可以重复。(红黑树:实际上是AVL的一种变形,但是其比AVL(平衡二叉搜索树)具有更高的插入效率,当然查找效率会平衡二叉树稍微低一点点,毕竟平衡二叉树太完美了。但是这种查找效率的损失是非常值得的。它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。)

另外,比如:map采用红黑树实现,比hash_map(未进入stl)稳定,但是一般没有hash_map快。

3.数据结构的的稳定与非稳定的是根据排序移动后原来在前面的逻辑位置仍然在前面保持不变的,所以map和set是稳定排序,multimap和multiset不稳定。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

两者的添加元素都可以用insert,只不过map的数据是pair对,而set是单值,那特殊的一点是map的下标操作

map下标操作(只能用于map(有序)和unorders_map(无序)):返回mapped_type(关键字映射的值),解引用返回value_type(即pair<const key_type, mapped_type>);若关键字还不存在,会创建一个对应关键字且值为0的新元素,已存在则返回最近一次赋的值。

只有map有下标,set类型没有是因为人家就一个键,没有值,而multimap没有是因为可能有多个值跟同一个键相关。

举例:

map<string, size_t> word_count;

word_count["Anna"] = 1;

这样等价于把{“Anna”, 1}插入了。 由于下标运算符可能插入新元素,所以我们只能对非const的map使用下标操作。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

那么关于有序map和无序unordered_map

无序容器是哈希表实现的,无序容器查询的时间复杂度可达到O(常数),内存消耗在于哈希表;而有序容器是红黑树实现的,查询的时间复杂度为log(n),但内存占用通常会少点。

map:map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。

unordered_map: unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。

优缺点:

map

优点:有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高

缺点:空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间

适用处:对于那些有顺序要求的问题,用map会更高效一些

unordered_map:

优点:因为内部实现了哈希表,因此其查找速度非常的快

缺点:哈希表的建立比较耗费时间

适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

总结:

1.内存占有率的问题就转化成红黑树 VS hash表 , 还是unorder_map占用的内存要高。

2.但是unordered_map执行效率要比map高很多

3.对于unordered_map或unordered_set容器,其遍历顺序与创建该容器时输入的顺序不一定相同,因为遍历是按照哈希表从前往后依次遍历的

参考:

https://blog.csdn.net/BillCYJ/article/details/78985895

https://blog.csdn.net/billcyj/article/details/78065438

猜你喜欢

转载自blog.csdn.net/qq_26896213/article/details/83748347