STL高频面试题
STL高频面试题
http://blog.csdn.net/u010126059/article/details/50708056
1.具体说明STL如何实现vector
vector的内部是使用动态数组的方式来实现的,如果动态数组的内部实现不够用,就要动态的重新分配内存。然后把原数组的内容拷贝过去。
2.vector和list的区别
vector和数组类似,拥有连续的内存空间,支持随机的存取,在中间进行元素的插入和删除的操作时间复杂度是O(n)
list是由双向链表实现的,只能通过数组指针来进行数据访问,遍历中间的元素,时间的复杂度是O(n).
3.如何选择使用vector或dequeue
一般情况下使用vector,在需要从首尾两端进行插入或删除操作的时候需要选择dequeue.
map内部的实现
map的底层是一棵红黑树,在对节点的插入或是删除操作中,通过旋转来保持平衡性,最坏情况下的插入、删除、查找时间是O(logn)
map和hashmap的区别
- 底层数据结构不同,map是红黑树,hashmap是哈希表
- map元素可以自动按照键值排序,hashmap的各项操作平均时间复杂度接近常数
- map是C++标准的一部而hashmap并不是
vector中erase方法与algorithn中的remove方法区别
- vector中erase方法真正删除了元素,迭代器不能访问了
- remove只是简单地将元素移到了容器的最后面,迭代器还是可以访问到。因为algorithm通过迭代器进行操作,不知道容器的内部结构,所以无法进行真正的删除。
什么是auto_ptr以及如何使用
auto_ptr可以代替指针进行类似指针的操作,并不用关心内存的释放,auto_ptr的析构函数自动释放它绑定的动态分配对象。
auto_ptr的实现
- 每次创建类的新对象的时候,初始化指针并将引用计数设置为1;
- 当对象作为另一个对象的副本而创建的时候,拷贝构造函数,拷贝指针并增加与之相对应的引用计数
- 对一个对象进行赋值的时候,赋值操作符减少左操作数所指对象的引用计数,并增加右操作数所指对象的引用计数
- 调用析构函数的时候减少引用计数,如果引用计数减少至0,则删除基础对象
- 重载*操作符和->操作符,使auto_ptr有类似于普通指针的操作
使用auto_ptr的限制
- auto_ptr所所指向的对象要求只能拥有一个拥有者
如下用法是错误的
classA *pA = new classA;
auto_ptr<classA> ptr1(pA);
auto_ptr<classB> ptr2(pA);
- 1
- 2
- 3
- auto_ptr不能以传值的方式进行传递b
- 不支持数组
版权声明

浙公网安备 33010602011771号