腾讯的面试官,问了几个STL的问题,一开始还好,后面的发现还是有好多细节自己没折腾清楚,所以再看一遍,然后总结一下。
1. vector
动态确定长度,支持随机存取,array是静态空间。 然后数据结构主要是三个迭代器(普通指针即可):
start: 表示目前使用空间的头
end: 表示目前使用空间的尾
end_of_storage: 表示目前可用空间的尾
动态增加大小,并不是在原空间之后接续新空间,而是以原大小的两倍(不完全是)另外配置一块较大空间,然后将原内容拷贝过来,并释放原空间。一旦引起空间的重新配置,指向原vector的所有迭代器就都失效了。
2. list
每次插入和删除一个元素,就配置或释放一个元素空间,对于任何位置的元素插入和元素移除,list永远是常数时间。
list的插入操作和结合操作都不会造成原有的list迭代器失效。
list的本身与list的节点不同,list的节点是一个双向列表。
3. deque
vector是单向开口的连续性空间,deque则是一种双向开口的连续性空间。
deque是连续空间(逻辑上是如此的),采用一块所谓的map作为主控。map是一小块连续空间,每个元素是指针,指向一段较大的线性空间,称为缓冲区。map本质是一个T**,也就说它是一个指针,所指之物也是一个指针,指向型别为T的一个空间。
deque除了维护一个map的指针外,也维护start,finish两个迭代器,分别指向第一个缓冲区的第一个元素和最后一个缓冲区的最后一个元素。它需要记住目前的map大小,因为一旦map所提供的节点不足,就必须重新配置一块更大的map。
4. vector和deque的区别
deque允许常数时间对投头端进行元素的插入和移除操作,deque没有所谓容量的观念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。
对deque进行排序,为了最高效率,可将deque先完整复制到一个vector中,然后对vector进行排序后,再复制回deque。
5. vector,list,deque的存取,插入与删除区别
vector适用于随机存取,支持[],随机存取时间为常数;但是在非末尾删除插入数据时,效率极低。
list适用于数组中间频繁插入删除数据,其插入删除开销低,但是不支持随机存取。
deque界于vector和list两者之间,支持随机存取,队首队尾插入删除操作开销极小。随机存取效率接近于vector,队首队尾插入删除接近于list。
6. stack, queue, heap, priority_queue
stack是以deque作为缺省情况下的stack底部结构。
queue也是以deque为底部结构并封闭其底端的出口和前端的入口。
heap使用vector表现的完全二叉树。
priority_queue缺省是使用vector为底部容器,再加上heap处理规则实现。
它们都没有迭代器,然后他们都不能称为容器,都只能叫做容器配接器。
总结:这个实际不难,很多自己都知道,但是没有去总结它,然后问的时候就突然愣神了,就没有回答好,主要还是自己没掌握好吧。