335-面经7

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、如果构造函数里面抛出异常会发生什么?内存泄漏?怎么解决?

对象没有构造成功,析构函数就不会调用,析构函数写的那些释放的代码就都不会得到执行,就是资源泄漏,内存泄漏是资源泄漏的一种。

怎么解决?
采用智能指针(**保证:**只要开辟成功的资源,智能指针对象析构的时候一定会去释放资源)。
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

liufeng2023

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

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

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

打赏作者

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

抵扣说明:

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

余额充值