STL容器底层 和Java容器的底层

STL的底层数据结构实现:
1)vector:底层数据结构为数组,支持快速随机访问。

2)list:底层数据结构为双向链表,支持快速增删。

3)deque:底层数据结构为一个中央控制器和多个缓冲区,支持首尾(中间不能)快速增删,支持随机访问。

4)stack:底层用deque或者list实现,不用vector的原因是扩容耗时。

5)queue:底层用deque或者list实现,不用vector的原因是扩容耗时。

6)priority_queue:底层数据结构一般以vector为底层容器,heap为处理规则来管理底层容器实现。

7)set:底层数据结构为红黑树,有序,不重复。

8)multiset:底层数据结构为红黑树,有序,可重复。

9)map:底层数据结构为红黑树,有序,不重复。

10)multimap:底层数据结构为红黑树,有序,可重复。

11)hash_set:底层数据结构为hash表,无序,不重复。

12)hash_map:底层数据结构为hash表,无序,不重复。

13)hashtable:底层数据结构是vector。

vector

对应Java的Vector 实现了List接口 使用synchronized关键字 线程安全(同步)
对应与Java的ArrayList 实现了List接口

1.说说std::vector的底层(存储)机制:
vector就是一个动态数组,里面有一个指针指向一片连续的内存空间。
当已经分配的空间不够装下数据时,(GCC是二倍扩容,VS13是1.5倍扩容)(Java vector是两倍 ,ArrayList是1.5倍)。把当前的值拷贝到新分配的内存中,并释放原来的内存。

list

对应Java的LinkList 实现了 List接口

2.说说std::list的底层(存储)机制。
以结点为单位存放数据,结点的地址在内存中不一定连续,每次插入或删除一个元素,就配置或释放一个元素空间,list自带排序函数的排序原理,其他排序使用algorithm里面的sort排序。

vector 和list 区别
3.什么情况下用vector,什么情况下用list。
vector可以随机存储元素(即可以通过公式直接计算出元素地址,而不需要挨个查找),但在非尾部插入删除数据时,效率很低,适合对象简单,对象数量变化不大,随机访问频繁。

list不支持随机存储,适用于对象大,对象数量变化频繁,插入和删除频繁。

deque

对应于Java的ArrayDeque 实现了Deque接口 (上层是Queue接口)

4.说说std::deque的底层机制。
首先他有很多段空间组合成,段内是连续的空间

deque 和 vector
5.说说deque与vector的区别。
vector是单向开口的连续线性空间,deque是双向开口的连续线性空间。(双向开口是指可以在头尾两端分别做元素的插入和删除操作)。

适配器
6.不允许有遍历行为的容器有哪些(不提供迭代器)?
queue 首 尾

对应与Java的Queue接口

stack 头部 top
priority_queue 头部 top

对应与Java的PriorityQueue(堆) 实现Queue接口

7.vector插入删除和list有什么区别?
vector与数据结构的顺序表相类似,插入和删除数据,需要对现有数据进行复制移动,如果vector存储的对象很大或者构造函数很复杂,则开销较大,如果是简单的小数据,效率优于list。

list对应于数据结构的链表插入和删除数据,需要对现有数据进行遍历,但在首部插入数据,效率很高。

未完待续。。。

猜你喜欢

转载自blog.csdn.net/BOWWOB/article/details/113380933
今日推荐