一面凉,感觉快手面试难度很大
快手游戏客户端 一面
给定指定的手牌,求能否全部打出
回溯
局部常量的存放位置?局部常量的作用?
静态存储区内的变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行期间都存在,它主要存放静态变量、全局变量和常量。
常量存放在静态,局部变量存放在栈中
vector、deque、map、hashmap的实现
deque删除的操作是怎么进行的,随机访问的时间复杂度
插入时根据前后的数据个数决定往前推动还是往后推动,随机访问的时间复杂度是O(1)
hash的查找的时间复杂度?怎么优化
o(1)
vector、deque、map、list、hashmap迭代器删除有哪些会失效?
序列式容器(数组式容器)
对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。
关联式容器
对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。erase迭代器只是被删元素的迭代器失效,但是返回值为void,所以要采用erase(iter++)的方式删除迭代器。
emplace_back和push_back的区别
少调用一个构造函数
智能指针
析构函数有异常会发生什么
在析构函数中是可以抛出异常的,但是这样做很危险,请尽量不要这要做。原因在《More Effective C++》中提到两个:
(1)如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。
(2)通常异常发生时,c++的异常处理机制在异常的传播过程中会进行栈展开(stack-unwinding),因发生异常而逐步退出复合语句和函数定义的过程,被称为栈展开。在栈展开的过程中就会调用已经在栈构造好的对象的析构函数来释放资源,此时若其他析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃。