1、讲一下map的底层实现,avl和rbtree有什么区别?
map底层实现: 红黑树
avl
(是平衡树 每个节点的左右子树高度差不会超过1 增删查的效率好,为了维护平衡 引入了旋转,元素量大,旋转的次数比较多,在百万数据中,效率比红黑树逊色)rbtree
(不是一颗平衡树,左右子树,长的不能超过短的2倍,红黑树的性质决定的)
2、假如map的键是类类型,那么map底层是如何调整的?
- map底层是红黑树 存储[key,value]键值对,对key进行比较的;
- 如果key是类类型,map默认用的是 less 比较小于,less< key 类类型;
- 要提供operator<运算符的重载函数
3、内存泄漏你会怎么处理?讲讲智能指针
-
怎么定位内存泄漏的问题,通过工具进行检测,比如说在VS上,通过添加vld,在运行的过程检查可能出现内存泄漏的问题,会指到相应的代码上。
-
为了防止内存泄漏,我们做好使用智能指针来智能管理资源。
4、如果让你实现一个内存池,要求获取资源和插入资源时间花费O(1),你会怎么设计?
SGI STL二级空间配置器的内存池的实现就可以了!!!(类似于哈希表)
5、编写一个C/C++程序你个人感觉需要注意一些什么?
- 分析问题的需求
- 分析完需求,进行概要设计和详细设计
- 分成哪些模块,模块和模块的共性地方
- 设计基础的类,函数接口,考虑全面,让程序的扩展性更好。
- 考虑线程安全的问题。
- 多线程,考虑代码的可移植性,调用系统的线程接口还是语言级别的线程类
- 设计模式
5、C++中vector和list的区别,stack和queue的底层实现,智能指针,C++11特性,迭代器失效的原因以及如何解决?
stack和queue的底层实现:
-
stack和queue是容器适配器;
-
底层没有实现任何数据结构,底层直接依赖一个现有的顺序容器,依赖的是deque,第二维数组独立new出来,不需要连续,内存碎片比较多的情况下内存分配是容易成功的。
-
vector的初始内存使用效率太低了,因为默认定义一个vector,它是从0开始,0到1,1到2,2到4,4到8,才慢慢分配起来。deque的第二维一下子就可以分配一块可用的空间,初始的内存使用效率不错的。
6、如果构造函数里面抛出异常会发生什么?内存泄漏?怎么解决?
对象没有构造成功,析构函数就不会调用,析构函数写的那些释放的代码就都不会得到执行,就是资源泄漏,内存泄漏是资源泄漏的一种。
怎么解决?
采用智能指针(**保证:**只要开辟成功的资源,智能指针对象析构的时候一定会去释放资源)。