【QandA C++】sort底层、vector、list、push_back/emplace_back、resize、reserve、迭代器失效、unordered_XXX对比map/set、红黑树

本文详细探讨了C++STL中的sort()函数底层原理,包括IntroSort的选择策略,以及vector、list的区别,push_back和emplace_back的性能差异,vector的resize和reserve功能,以及迭代器失效的处理。同时,文章比较了unordered_map/set与红黑树实现的效率和特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sort( ) 底层原理

sort( ) 源码中采用的是一种叫做IntroSort内省式排序的混合式排序算法,

第一步

首先进行判断排序的元素个数是否大于stl_threshold,stl_threshold是一个常量值是16,意思就是说我传入的元素规模小于我们的16的时候直接采用插入排序

为什么用插入排序?因为插入排序在面对“几近排序”的序列时,表现更好,而快排是通过递归实现的,会为了极小的子序列产生很多的递归调用在区间长度小的时候经常不如插入排序效率高)

第二步

如果说我们的元素规模大于16,那就需要去判断如果是不是能采用快速排序,怎么判断呢?

快排是使用递归来实现的,如果说我们进行判断我们的递归深度有没有到达递归深度的限制阈值2*lg(n),如果递归深度没达到阈值就使用快速排序来进行排序

第三步

如果说大于我们的最深递归深度阈值的话,这个时候说明快排复杂度退化了(比如很不巧基准元素多次选取到了当前区间中最小或最大的元素。这种情况下,每次划分只能将区间缩小1个元素,造成递归深度过深),就会采用我们的堆排序,堆排序是可以保证稳定O(nlogn)的时间复杂度的。

vector和list的区别

vector是表示可变大小数组的序列容器,vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的存储空间一般更大。

list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。

vector

list

底层结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

珠江上上上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值