面试必会(嵌入式)-C++之<STL>(六)

目录

1. vector list异同⭐⭐

2 .vector的底层实现⭐⭐

3 .vector和deque的区别⭐⭐⭐

3.1  Deque(双端队列)的特点可以总结如下:

3.2  Deque和vector的区别

3.3  Deque和vector和LIST使用场景:⭐⭐

4.为什么ist里面还要再定义一个sort函数⭐

5 .STL底层数据结构实现⭐

6.利用迭代器删除元素会发生什么?⭐⭐⭐⭐

6.1  vector容器

6.2  map和set容器

6.3  list容器

7 .map是如何实现的,查找效率是多少⭐⭐⭐

8.几种模板插入的时间复杂度 ⭐⭐⭐⭐

9. 讲一下vector动态扩展的原理?⭐

10. Vector动态扩展时,编译器为什么不先判断一下原有空间后面的内存是否空闲,如果空闲,直接在后面的内存空间继续分配空间?⭐

11.Unordered_map和map,unordered_set和set,分别有什么区别,它们的底层数据结构是什么?⭐⭐

12. prioriry_queue优先级队列的底层数据结构是什么?操作的时间复杂度是什么?⭐⭐⭐


1. vector list异同⭐⭐

List:

  • List是一个双向链表的容器,每个元素都由一个节点表示,节点包含指向前一个节点和后一个节点的指针。
  • 插入和删除元素的时间复杂度为O(1),因为只需要改变节点的指针,而不需要移动其他元素。
  • 由于节点间的指针关联,内存空间不是连续分配的,因此对于需要频繁的插入和删除操作的场景,list可以更高效。
  • 在访问元素方面,由于不具备随机访问特性,只能通过迭代器逐个遍历,时间复杂度为O(n)。
  • list可以有效地处理大规模数据的插入和删除,但相对于vector来说占用更多的内存空间。

Vector:

  • Vector是一个动态数组的容器,元素的存储是连续的。
  • 插入和删除元素的时间复杂度为O(n),因为可能需要移动其他元素,尤其是在中间位置插入或删除元素时。
  • 在访问元素方面,由于具备随机访问特性,可以通过下标访问元素,时间复杂度为O(1)。
  • 向量的扩容和收缩可能会导致内存的重新分配和元素的复制,因此在需要频繁插入和删除的场景下效率较低。
  • 向量的内存空间是连续分配的,因此对于需要高效的随机访问操作的场景,vector更合适。
  • 相对于list来说,vector在占用内存空间方面更为节省。

总结:

综上所述,list适用于需要频繁插入和删除元素的场景,对内存占用要求较高;vector适用于需要高效的随机访问和尾部插入操作的场景,对内存占用要求较低。选择合适的容器类型取决于具体的需求和对性能的要求。

2 .vector的底层实现⭐⭐

1、底层实现

Vector在堆中分配了一段连续的内存空间来存放元素。

包括三个迭代器,first 指向的是vector中对象的起始字节位置;last指向当前最后一个元素的末尾字节;end指向整个vector容器所占用内存空间的末尾字节。

  • vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新的元素。vector的关键技术在于对大小的控制以及重新分配时的数据移动效率。
  • vector采用的数据结构是线性的连续空间(泛型的动态类型顺序表),他以两个迭代器start和finish分别指向配置得来的连续空间中目前已将被使用的空间。迭代器end_of_storage指向整个连续的尾部。
  • vector在增加元素时,如果超过自身最大的容量,vector则将自身的容量扩充为原来的两倍。扩充空间需要经过的步骤:重新配置空间,元素移动,释放旧的内存空间。一旦vector空间重新配置,则指向原来vector的所有迭代器都失效了,因为vector的地址改变了。

3 .vector和deque的区别⭐⭐⭐

3.1  Deque(双端队列)的特点可以总结如下:</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值