unordered_set与set都是c++STL中两个重要容器,unordered_set是C++11标准的时候推出的新容器,unordered_set与set使用上几乎没有什么区别,其内部的成员函数也大差不差.
它们的主要区别在于内部实现的数据结构不同,set的内部实现是一个红黑树的平衡二叉树,但unordered_set其内部的实现是一个哈希表,两者结构大不相同,因此它们所呈现出的插入,查找,删除效率以及元素的储存排列顺序也都有不同.
set存储的元素是有序的,在遍历set时,里面的元素会默认按从小到大的顺序排序,且其的插入,删除和查找的时间复杂度都是对数级的,比较均匀.
其结果为:
可见插入的顺序是不会影响set最终存储元素的顺序的.另一方面对于unordered_set来说其在一般情况下其查找效率是要高于set的,其查找和删除等的操作的世间复杂度是常数级的,但是在级少数情况下set的可能要高于unordered_set(比如冲突较多的情况下).同时unordered_set由于其内部是用哈希表实现的,所以其内部存储的元素之间是没有什么逻辑顺序,这与set刚好反过来的,在实际的应用中我们可以根据是否要求数据之间的有序性来使用set或者unordered_set.
还有一点要注意的是unordered_set在数据量较小的时候可能也会表现出一种有序性,比如:
其结果为:
但若数据量大时哈希表进行扩充,那么其顺序就不确定了,比如:
其结果为:
所以千万要记住unorder_set其内部元素存储是无序的(unordered这个词也是无序的意思),不要给误导了!!!