STL总结之顺序容器

本文深入探讨了C++标准模板库(STL)中的vector、list、deque等容器的特点及应用场景,对比了它们之间的性能差异,并介绍了stack、queue、heap、priority_queue的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  腾讯的面试官,问了几个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处理规则实现。

  它们都没有迭代器,然后他们都不能称为容器,都只能叫做容器配接器。


总结:这个实际不难,很多自己都知道,但是没有去总结它,然后问的时候就突然愣神了,就没有回答好,主要还是自己没掌握好吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值