其实一直在用这俩stl,今天在看数据去重的论文,记录一下吧,万一后期用的上。
1、实现方式:
map
是基于红黑树实现的,它保持元素有序,插入和查找的时间复杂度是O(log n)。unordered_map
是基于哈希表实现的,不保持元素有序,插入和查找的时间复杂度平均为O(1)。但最坏情况下可能会达到O(n)。
2、元素顺序:
map
中的元素按照键的自然顺序(或者通过自定义比较函数)进行排序,所以遍历得到的元素是有序的。unordered_map
中的元素没有特定的顺序,遍历得到的元素顺序与插入顺序无关。
3、查找效率:
map
适用于需要有序数据以及频繁查找的场景。unordered_map
适用于对插入和查找性能要求较高,对元素顺序无特别要求的场景。
4、内存开销:
- 由于
map
使用红黑树来维护有序性,它的内存开销通常比unordered_map
要高。unordered_map
使用哈希表,其内存开销通常较低,但在存储大量数据时,由于哈希表冲突可能需要更多内存。
5、需要的头文件:
map
需要包含头文件<map>
。unordered_map
需要包含头文件<unordered_map>
。
6、关键字类型要求:
map
要求关键字类型有比较函数或支持<
运算符来进行元素排序。unordered_map
要求关键字类型支持哈希函数和==
运算符。
7、C++标准要求:
map
和unordered_map
都是C++标准库的一部分,但在C++11之前,只有map
是标准库的一部分,而unordered_map
是在C++11引入的新容器。
8、迭代器稳定性:
map
的迭代器在插入和删除元素时不会失效,因为它使用红黑树来保持顺序。unordered_map
的迭代器在插入元素时可能会失效,因为哈希表的重新哈希过程可能导致元素位置改变。
综上所述,选择使用map
还是unordered_map
取决于具体的应用场景和性能要求。如果需要有序数据、稳定的迭代器以及对查找性能不那么敏感,那么map
是一个不错的选择。如果对查找性能要求较高,对元素顺序无特殊要求,并且能够接受较少的内存开销,那么unordered_map
可能更适合。