面试问题整理1
- C++中 deque的实现
可以在两端高效插入、删除数据,支持随机访问
内部实现原理:利用分段数组,将元素存放在一个个大小固定的数组中,再有一个索引数组存放这些数组的首地址。
头部插入数据时,移动头部首地址索引即可,从后往前移动,如果当前数据段满了,则将数据保存在新创建的分段数组中,并将其首地址加入到索引数组中。
尾部插入时,顺序是从前到后,其他的一样。
- move() 函数
move()
并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值。
一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。
专门处理,用a初始化b后,就将a析构的情况。
拷贝构造函数中,对于指针,我们一定要采用深层复制,而移动构造函数中,对于指针,我们采用浅层复制。
移动构造函数的参数和拷贝构造函数不同,拷贝构造函数的参数是一个左值引用,但是移动构造函数的初值是一个右值引用。
参考: C++移动构造函数以及move语句简单介绍
左值与右值:
-
多重循环时,能放在外层的计算、判断放在外层;并且最长的循环放在内层,最短的放在外层,以减少CPU跨切循环层的次数;遵循行优先访问原则,与元素存储顺序一致。
-
CPU包括四个部分:控制单元、运算单元、储存单元和时钟。
-
如何用队列实现栈
队列是先进后出的顺序,而栈是先进先出,用队列实现栈可采用如下方法:参考Letcode225题
两个队列实现:q1为主队列,q2为辅助队列,将q1前q1.size()-1个元素弹出来,依次加入到q2中,最后将q2中的元素导回到q1中
一个队列实现:使队头对应栈头,队尾对应栈底,每次有新的元素入栈时:先在队尾加入新元素,并将前面q.size()-1个元素从队头取出依次放在队尾。
#include<iostream>
#include<vector>
using namespace std;
class QueuetoStack(){
public:
queue<int> q;
void push(int x){
q.push(x);
for(int i = 0; i < q.size()-1; i++){
q.push(q.front());
q.pop();
}
}
int pop(){
int top = q.front();
q.pop();
return top;
}
int top(){
return q.front();
}
bool empty(){
return q.empty();
}
};
int main(){
return 0;
}
- C++多态原理
概述:在父类的基函数前加关键字vitual,派生类中重写该函数,运行是程序会根据对象的类型动态调用相应的函数。
父类使用虚函数时,类内增加一个虚函数指针(vfptr)指向虚函数表(vftable);派生类重写父类的虚函数时,虚函数表会替换成子类的
基类的虚函数不用实际意义的实现,可以采用纯虚函数,添加 virtual func() = 0;
即可
- push_back 与 emplace_back的区别
push_back()需要先构造临时对象,再将这个对象拷贝到容器的末尾,而emplace_back()则直接在容器的末尾构造对象,这样就省去了拷贝的过程。
计算机网络相关问题
-
百度网盘下载速度为什么是缓慢增加后稳定?