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对应于数据结构的链表插入和删除数据,需要对现有数据进行遍历,但在首部插入数据,效率很高。
未完待续。。。