【C++面试知识】虎牙现场面

第一次现场面试,没想到十分钟左右就结束了,很受伤,我还想着等下二面要是问我一些很深的问题我估计答不上来,没想到一面就挂了。

我觉得我除了2、3小点没有答好,还有就是自己的项目太水了,基本都是课程项目,其他自己都满意,包括自我介绍、回答问题,奈何面试官要求比我高得多(不要对自己要求这么低),还是自己太菜了。我很后悔当时没有问清楚要怎么回答面试官才能满意,很后悔。。

还有就是面试官不会在你回答有问题的时候提醒你错了,这就像考试,全靠自己,面试官只是给你题目而已,不会去引导你什么,问完了,也就考完了,没有容错率。

总结一下问题吧:

1.什么是梯度下降法

显然我应该答出来的,因为上学期刚学过,可我就是记不起来,可这跟C++研发有很大关系吗?我当时被震惊了,一上来就是个数学问题。

后来我搜了一下,这也是机器学习方面经常用到的知识,还是自己太菜了。

图片来自https://blog.csdn.net/qq_24753293/article/details/80051555

2.讲一下extern的作用

这个知识点比较意外问到了,但是凑巧我在面试前不久刚看到了,主要两个作用,一个extern 后接C,表示告诉编译器在编译后面跟着的函数名时按着C的规则去翻译相应的函数名而不是C++的;一个是后面不接C,直接跟着变量或者函数,它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。

(面试官还问extern C做了什么?这个问题是在我回答了extern C的作用后的一个问题,我不明白面试官想要我回答什么,现在也没明白)

3.虚函数的作用

虚函数是用来实现多态的,同一个实现接口,根据指向的对象不同而实现不同的功能。关于虚函数的定义和实现在我前面的博客可以找到。

4.vector和list的区别

vector是用动态数组实现的,内存不够需再申请同样大小的数组进行内存拷贝,另外地址是连续的,随机存取时间复杂度是O(1),插入和删除时间复杂度是O(N);

list是用双向链表实现的(我说成了单向。。),是不连续的地址空间,随机存取需要遍历整个list,复杂度是O(N),插入和删除时间复杂度是O(1)。

4.2 如果在vector尾部插入一个结点,当前迭代器会失效吗?(没答出来)

会失效,因为插入新数据后vector需要重新申请内存,那么存放这些元素的地址会发生变化,那么迭代器自然失效。(还是自己理解不够到位)

删除结点也会使得那个结点后面的结点的迭代器失效,因为后面的结点都要往前移一位,

5.map的底层实现,为什么要用这种方式实现

这个问题我觉得我答得没有什么问题;

(哦,我记起来了,这个问题他当时有问数组的随机存取复杂度是多少,我当成了查询的复杂度了,我说了O(N),其实是O(1),啊啊啊啊啊啊啊啊啊啊啊啊啊,所以这么简单的问题被我搞错了,面试官就有理由挂我了,啊啊啊)

底层实现是用红黑树实现的,因为红黑树其实是一颗平衡二叉树,然后查询的时间复杂度是O(logN),会比使用数组的查询复杂度O(N)更低。

6.析构函数需要用虚函数吗(这个问题应该放在第三个题目后的,不过无所谓了)

这个问题我之前看过,没仔细看,但是还是只能怪自己只会死记硬背,没真正理解虚函数的用法,理解了,这个问题就好答了。

答案是需要用虚函数,因为如果不用虚函数,如果要调用子类的析构函数的话,就会只调用基类的析构函数,那么子类的内存空间得不到释放,就会造成内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值