字节跳动-抖音C++开发面经(牛客上的面经,找了答案记录下来)

1.最长无重复字符子串
滑动窗口解法:最长无重复子串

2.std::unordered_map/std::map的区别
1)map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的。可以做到在O(log n)时间内完成查找,插入和删除。
2)unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的。
在需要有序性或者对单次查询有时间要求的应用场景下,使用map,其余情况使用unordered_map。

3.std::weak_ptr如何转std::shared_ptr?
使用lock成员函数

4.std::weak_ptr::lock存在的意义是什么
weak_ptr被设计为与shared_ptr共同工作,可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。同样,在weak_ptr析构时也不会导致引用计数的减少,它只是一个静静地观察者。weak_ptr没有重载operator*和->,这是特意的,因为它不共享指针,不能操作资源,这是它弱的原因。但它可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象,从而操作资源。

5.析构函数可以是纯虚函数吗
构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数(定义为抽象类)

6.为什么要有内存池
1)操作系统适合管理大块内存,不适合小块内存分配;不做内存池管理,容易产生内存碎片;
2)直接调用操作系统分配内存会导致频繁从用户态切换到内核态,开销比较大;

7.什么是内存碎片,为什么会有内存碎片,如何处理内存碎片
内存碎片通常分为内部碎片和外部碎片:
1)内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎片,通常内部碎片难以完全避免;
2)外部碎片是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存分配请求,从而不能被进程利用的内存区域。

如何处理内存碎片:
1)伙伴算法,用于管理物理内存,避免外部碎片
2)高速缓存Slab层用于管理内核分配内存,避免内部碎片。
Linux是如何避免内存碎片的

8.详细介绍快排
在这里插入图片描述
快速排序及其优化

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值