1,用new分配对象失败后有什么后果
答:如果调用失败的话会首先访问用户实现的 set_new_handle函数,一般该函数是去释放些无用的内存,然后再去尝试申请,然后反复调用该函数直到申请成功,主要还是看用户实现的函数怎么样
然后退出的话会抛出bad_alloc异常,异常会直接让程序崩溃,可以选择在 new (nothrow) 这样就不会抛出异常了,或者使用 try catch捕获异常
2访问一个私有成员函数 有什么方法
答:使用友元,友元类和友元函数都可以去访问类的私有属性,友元不可以被继承,友元一般少用,因为会破坏封装性
3 static修饰类成员 访问是如何访问的 必须实例化吗
答:不一定要实例化,因为static申明的变量在全局变量区,是类所有的,所有对象共有这个内存空间,所以可以直接通过类访问,也可以实例化区访问
4怎么样用两个队列实现一个栈
答:呃,不是我说,这个官方做法真滴蠢,就是把如果push的话就一直push进当前队列,如果要取当前的值,就只要把前面所有的都装进另一个队列,留下最后一个,然后pop就可以了
另一个问题就是两个栈实现一个队列,将一个栈实现出一个实现进,然后如果出的那个队列当前为空的话,那么将进队列的所有数都放入出队列中,然后进行操作,复杂度O(n)
5 vector底层是怎么实现的?
答:核心要点主要是vector所谓的动态数组怎么实现的,vector底层 有三个标志 元素起始位 元素末尾位 内存末尾位 ,如果元素满了容量的话,那么就会扩充内存容量,是之前的
两倍,要经历三个步骤, 重新构建内存, 把之前的值赋值过来 销毁之前的内存
6 哈希表怎么实现?哈希冲突解决办法
答:哈希表其实也就是一种映射关系,用哈希函数产生出一个值,然后去映射,哈希函数通常都是%的值,有开放地址法,链地址法,再哈希法等等
7 构造函数可不可以是虚函数?析构函数呢
答:构造函数不可以是虚函数,因为虚函数调用需要有虚函数指针,但是虚函数指针存在于具体对象中,产生对象需要构造函数,所以矛盾
析构函数可以是虚函数,一般用于多态,父类指针指向子类,如果调用析构,那么就会调用的其实是子类的析构函数,子类析构函数默认会调用父类析构函数达到一起释放内存,如果不是虚函数,那么只会
释放掉父类部分
8 两个链表有公共交点,如何找到一个公共交点?
答:
第一种:类似快慢指针求入口的思想,p1,p2,指针同时移动,p1走完后从p2链表头开始走,p2走完后从p1链表头开始走,迟早会相遇,核心思想两个指针都走一个一样的路就会相遇
也就是第一个指针走的 A链表不重合部分+重合部分+B链表不重合部分, 第二个指针走的 B链表不重合部分+重合部分+A链表不重合部分
第二种:使用unorder_map 遍历第一个链表所有,保存地址,然后遍历第二个链表,如果出现了代表是当前位置
9,给定字符串 S,找出最长重复子串的长度
答:我想的做法是预处理出哈希,然后n2遍历所有区间,还没去写,没得到验证
网友说他们想的二分 和 DP做法
总结:总的来说今天,2,4没答出来,2的话emmmm,一时脑抽忘了,4,e没想到官方做法都这么蠢,答是答得上来,只是没想到正解就是这样