[C++] STL相关面试题

(1) 为什么map和set的插入删除效率比用其余序列容器高?数据结构

由于map和set的内部数据结构是红黑树,它的插入和删除不需作内存的拷贝和移动。(红黑树的插入和删除是log(n)的)。性能

(2) 为什么每次insert以后,之前保存的iterator不会失效?spa

iterator这里就至关于指向节点的指针,内存没有变,指向内存的指针怎么会失效呢(固然被删除的那个元素自己已经失效了)。相对于vector来讲,每一次删除和插入,指针都有可能失效,调用push_back在尾部插入也是如此。由于为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入过程当中可能已经被其余内存覆盖或者内存已经被释放了。即便时push_back的时候,容器内部空间可能不够,须要一块新的更大的内存,只有把之前的内存释放,申请新的更大的内存,复制已有的数据元素到新的内存,最后把须要插入的元素放到最后,那么之前的内存指针天然就不可用了。指针

(3) 向一个vector中添加N个元素,平均的添加的性能是?接口

看看下面代码的输出:内存

vector<int> v;ci

for(int i=0;i<100;i++}it

{io

  cout << v.capacity() << endl;效率

  v.push_back(i);

}

能够看到空间的变化是0,1,2,4,8,16... (GCC下是如此,VC下不是..)

这个须要考虑到当空间不够时,须要开辟新的内存而且发生元素的copy. 通常状况下开辟的空间是原来的2倍。那么平均的添加时间是:(1+2+4+...+(N-logN))/N,也就是有logN个元素添加时须要总体挪动n次,其它的操做代价是1,平均下来依旧是O(N)。

(4) 如何理解容器适配器,其与顺序容器有什么区别?

adapter原意是插座、适配器、接合器的意思。如今我须要一个栈结构,咱们能够用deque来模拟,只在一端进行元素插入和弹出,另外一端不动。但deuqe毕竟不能直接做为一个stack,它并不能直接地严格地知足你的要求,由于你不能防止别人在另外一端乱动你的东西。你须要对它进行一些包装,做一些限制,使之只能在一端进行插入和删除。也就是说你必须提供一个“插座”,这个“插座”一端插在deque上,另外一端插在你的程序中,你就可使用栈结构了。而stack就是这样的“插座”,它链接了deque和你的程序。表面上看你使用的是stack,实际上你是经过stack这个“插座”来使用deque(由于stack彻底是用deque来实现的,它并无任何其余的东西,它只是在deque上面做了一层包装,至关于一个“插座”的功能)。所以,stack、queue、priority_queue这样的类通常称为容器适配器,它们只是基本容器类型(vector,dequeue,list)的适配。  实际上,这也适配器模式的基本思想:将一个类的接口转换成客户但愿的另一个接口。Adapter模式使得本来因为接口不兼容而不能一块儿工做的那些类能够一块儿工做。也就是说,在一个类的接口上提供一个“插座”类,使它变成你但愿使用的接口。

相关文章
相关标签/搜索