C++ - map 和 set 使用介绍_chihiro1122的博客-CSDN博客
C++ - map 和 set的 例题_chihiro1122的博客-CSDN博客
C++ - map 和 set 的模拟实现上篇 - 红黑树当中的仿函数 - 红黑树的迭代器实现-CSDN博客、
C++ - set 和 map 的实现(下篇)- set 和 map 的迭代器实现_chihiro1122的博客-CSDN博客
这里的两个容器和之前的 map 和 set 是不一样的两个容器。之前两个容器的底层是使用 红黑数实现的,迭代器也是使用的红黑树的迭代器。而 unordered_map容器 和 unordered_set 容器 的底层是哈希表,这两对之间的底层实现是完全不一样的。
但是两者之间使用的 方式基本是一样的:
大概功能函数:
map:
set:
唯二和 set 和 map 不同的,多出了 哈希桶当中的功能函数;还有,unordered 当中的迭代器不是双向迭代器,而 map 和 set 当中是双向迭代器。
因为 unordered_map 和 unordered_set 的底层都是 哈希表实现的,所以当我们顺序输出这个 容器当中的内容的时候,不是有序的,但是去重的效果还是可以实现。因为 哈希表是 高效的查找,但是其中元素的排列并不是完全有序的,按照一定规律排列在 其中,如下使用例子:
- unordered_set<int> s;
- s.insert(3);
- s.insert(10);
- s.insert(50);
- s.insert(43);
- s.insert(22);
-
- unordered_set<int>::iterator it = s.begin();
- for (auto e : s)
- {
- cout << *it << endl;
- ++it;
- }
输出:
- 43
- 3
- 50
- 10
- 22
当然,两个容器也都有没有去重效果的 multi 版本:
当然,unordered_map 的使用和 map 也差不多,具体可以参考 map 和 set 的博客:
C++ - map 和 set 使用介绍_chihiro1122的博客-CSDN博客
unordered_map 和 unordered_set 在find()函数(查找)上,和 map 和 set 的查找两对的效率还是差不多的,基本一致,
但是 unordered_map 和 unordered_set 在insert()插入 和 erase()删除结点的效率上,如果是插入的数据重复数据较多,两者的效率要比 map 和 set 高出几倍;
如果是插入的数据少,和很少有重复的情况下,两对的插入效率差不多(但是如果插入的数据量太大,unordered_map 和 unordered_set 两个容器反而没有占到便宜,要比 map 和 set 效率低),但是删除效率还是 unordered_map 和 unordered_set 要 明显优于 map 和 set。
如果是有序的数据,那么 unordered_map 和 unordered_set 除了在 查找上和 map set 一样,但是在 插入和删除上的效率就要比 上述两种情况的效率要更低了,unordered_map 和 unordered_set 在这种情况之下逃不了多少好处。
所以,我们看到,两种方式实现的 map 和 set都在各自的适应的情况下有着不低于对方的效率,我们要看当前场景来选择适用于当前场景的 这 四种容器。