八股文——STL和数据结构与算法

STL和数据结构与算法

1.STL了解吗?常用哪些容器

2.List和vector有什么区别

底层:List 带有头结点的双向链表,存储在内存中不连续。

​ vector是类似于数组的顺序表,存储在内存中连续。

随机访问:vector支持( O(1)),List不支持。

插入: List效率为O(1),因为只用更改该节点的前后指针。

​ vector为O(n),因为插入vector要移动元素,并且有可能需要再次扩容。

内存碎片:因为List是不连续的,可能会出现内存碎片

​ 而vector连续,不容易产生。

当然还有许多区别,这里不一一指出,面试中答出以上也算OK了。

(回答这类问题如果有把握的话可以把使用场景一起说了)

使用场景:

看是否需要随机访问,是经常用于随机访问还是插入。

3.讲一下vector的扩容机制

当vector本身容量不够存放时便会自动扩容达到动态数组的效果。

扩容不是简单的尾部增加空间,而是找到一块新的足够大的内存将之前已存在的数据搬运过去。

(比如 某个存放8个数据容器T此刻需要扩容,扩容前T[0]T[8]存放在地址A中,当扩容完成后,T[0]T[8]就不在地址A了,因为之前内存会被释放)

因此少进行vector的自动扩容会更好的提高效率。(利用构造函数申请好所需要的空间或者利用reserve())

不同的编译器扩容大小也不一样,vs15扩容是1.5,GCC是2。

重点要答出来:

为什么是成倍而不是固定增加?

​ 为了使尾插入的时间复杂度成为O(1)

为什么是1.5或者2倍,不能是3或4倍?

​ 倍数过大容易使申请的新空间比之前已经申请的旧空间还大,导致空间的无法重复利用。

相关文章

4.vector< bool >有什么问题吗?vector< void >合理吗?

vector< bool >是陷阱,其中的元素并不是bool型,并且也不属于一个容器。

解释

vector< void >不能通过编译。

(这个问的不多,但很有意思,可以去了解一下)

5.迭代器失效是什么原因

当容器扩容时,正如我们之前提到的元素迁移,元素被搬走,内存被释放,我们的迭代器可没有被转移指向新内存。

这样就会造成迭代器失效。

6.容器适配器知道吗,讲一下stack和queue

C++容器适配器

7.能和我说说优先队列的底层吗

STL之priority_queue及其底层实现

8.map和unordered_map的区别是什么

(红黑树和哈希表,顺便一提unordered_map用的开链法解决哈希冲突,什么是哈希冲突以及其他相关办法也得了解一下)

map和unordered_map二者的区别

重点关注二者操作的时间复杂度和底层结构。

哈希相关面试知识

set和unordered_set同理,再想想set和map的区别就可以推出unordered_set和unordered_map的区别。

9.红黑树是什么,简单介绍一下,和平衡树的区别是什么

我当时看的漫画这篇,一次就了解了,有点长,滚轮都滚累了

漫画讲解红黑树

不想看漫画的可以看下面这个

非漫画

10.string为什么不提供分割方法

(这个很难,就遇到一次,和面试官聊天的时候提到的,我也有点懵为什么这么问,知乎上有帖子专门分析,感兴趣可以看看)

相关链接

11.平常使用哪些排序算法,std::sort()用的哪种

STL中的sort并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。

简单来说就是根据数据量来选择合适的排序算法。快排如果递归太多次,就会改成推排序。

12.常见操作的时间复杂度(比如map和unordered_map的插入查找,vector和list的插入查找等等)

【C++】STL各容器的实现,时间复杂度,适用情况分析

13.常见排序算法的时间复杂度,以及是否稳定

img

14.容器方法size capacity有什么区别

size是当前存放数量,capacity是容量,也就是可存放数量。

--------------------------------------下面是遇到算法题------------------------------------------------

括号匹配

(我用的栈)

找到链表倒数第k个数

(暴力,双指针)

单链表逆转

(双指针,快慢指针)

树的中序遍历

(递归非递归)

N个数中只有某个数出现的次数是奇数,如何找到哪个数字

(异或)

N*M的地图,从左上角开始只能向下和向右一次走一步,走到右下角有几种路线

(动态规划)

N(N特别特别大)个数据中找最大的数

(这个题特别经典,不管是CSDN或者Leetcode中都有相应的记录,一定要搞懂最少两种方法)

剩下想不起来了。。想起来再补充。。

---------------------------------------益智题目-----------------------------------------------------------

2的17428次方最后一位

一堆外观相同的球找唯一一个质量不同的球,不知道是轻还是重

\

剩下想不起来了。。想起来再补充。。

---------------------------------------学习数据结构和算法时-------------------------------------------------

做算法题一定要想想有没有别的方法,不管是从时间复杂度还是空间复杂度来优化这个算法。

面试的时候不是做出来那么简单,还会顺便问问有没有别的解法。
充。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值