unordered_set与set的区别

        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这个词也是无序的意思),不要给误导了!!! 

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值