C++ - unordered系列关联式容器介绍 - 和 set map 的比较

 前言

 C++ - map 和 set 使用介绍_chihiro1122的博客-CSDN博客

C++ - map 和 set的 例题_chihiro1122的博客-CSDN博客

C++ - map 和 set 的模拟实现上篇 - 红黑树当中的仿函数 - 红黑树的迭代器实现-CSDN博客、

C++ - set 和 map 的实现(下篇)- set 和 map 的迭代器实现_chihiro1122的博客-CSDN博客

unordered_map容器 和 unordered_set 容器

这里的两个容器和之前的 map 和 set 是不一样的两个容器。之前两个容器的底层是使用 红黑数实现的,迭代器也是使用的红黑树的迭代器。而 unordered_map容器 和 unordered_set 容器 的底层是哈希表,这两对之间的底层实现是完全不一样的。

 但是两者之间使用的 方式基本是一样的:

C++ - unordered系列关联式容器介绍 - 和 set map 的比较_第1张图片

C++ - unordered系列关联式容器介绍 - 和 set map 的比较_第2张图片 大概功能函数:

map:

C++ - unordered系列关联式容器介绍 - 和 set map 的比较_第3张图片

set:

 唯二和 set 和 map 不同的,多出了 哈希桶当中的功能函数;还有,unordered 当中的迭代器不是双向迭代器,而 map 和 set 当中是双向迭代器。

因为 unordered_map 和 unordered_set 的底层都是 哈希表实现的,所以当我们顺序输出这个 容器当中的内容的时候,不是有序的,但是去重的效果还是可以实现。因为 哈希表是 高效的查找,但是其中元素的排列并不是完全有序的,按照一定规律排列在 其中,如下使用例子:

	unordered_set s;
	s.insert(3);
	s.insert(10);
	s.insert(50);
	s.insert(43);
	s.insert(22);

	unordered_set::iterator it = s.begin();
	for (auto e : s)
	{
		cout << *it << endl;
		++it;
	}

输出:

43
3
50
10
22

 当然,两个容器也都有没有去重效果的 multi 版本:

C++ - unordered系列关联式容器介绍 - 和 set map 的比较_第4张图片

C++ - unordered系列关联式容器介绍 - 和 set map 的比较_第5张图片

 当然,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都在各自的适应的情况下有着不低于对方的效率,我们要看当前场景来选择适用于当前场景的 这 四种容器。

 

你可能感兴趣的:(c++,开发语言)