c++STL容器特点以及底层实现
Posted 头号理想
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++STL容器特点以及底层实现相关的知识,希望对你有一定的参考价值。
什么是STL
标准模板库,是一个高效的c++程序库
包含了诸多基本数据结构和基本算法,高度体现了软件的可复用性
容器
vector
是一种序列式容器,和数组差不多,他比数组更加优越,
数组不能动态扩展,因此程序运行的时候不是浪费内存就是数组越界
vector正好弥补了这个缺点,它相当于是一个可拓展的数组(动态数组)
随机访问快,中间插入删除慢 末端插入删除快
特点
拥有一段连续的内存空间,起始地址不变,它能非常好的支持随机存取([ ])
但是由于内存空间是连续的 所以在中间插入和删除数据的造成内存块的拷贝
在数组所申请的内存不够的时候,需要重新申请一块更大的内存 这里也有内存的拷贝,大大影响了vector的效率
优点:支持随机访问,查询效率高
缺点:在中间插入和删除元素效率低
list
由双向链表实现,元素存放在堆中,通过指针来实现对数据的访问
因此随机存取变得没有效率 没有[ ]操作符重载
但是他有链表的特点 插入和删除数据效率很高
没有空间预留,每一个元素都在内存中分配,每删除一个元素都会释放其占用的内存
优点:内存不连续 插入和删除数据的效率很高
缺点:不支持随机访问
deque
是由一段一段的定量连续空间构成,一旦要在deque的前段和尾端增加新的空间
是list和vector的折中方案,查询效率高
不适合中间元素的插入和删除
set
由红黑树实现,内部依据值自动排序,每个元素只能出现一次,不许重复
特点
对于关联容器 不需要内存拷贝和内存移动 所以map和set插入删除的效率比其他序列高
set中的元素都是排好序的 集合中没有重复的元素
优点 使用平很二叉树实现,便于元素的查找,保证了元素的唯一性,以及自动排序
缺点 每次插入值的时候,都要调整红黑树 对效率有影响
multiset和set相同,只不过可重复元素 也就是说multiset可存在多个数值相同的元素
map
由红黑树实现 键值/实值 所形成的的一个个对应关系,每个元素都有一个键 只能出现一次 不能重复
map主要用于一对一的情况,map内部自建一颗红黑树,对数据自动排序
优点 使用平衡二叉树实现,便于元素的查找,能把一个值映射成另一个值
缺点 每次插入值的时候,都会调整红黑树 对效率产生影响
multimap 和map相同,只不过可重复元素 multimap 可包含多个键值(key)相同的元素
之前面试中面试官问到我一个问题:
用vector存数据和map存数据有什么区别?
刚开始我以为面试官想问我map的对应关系的
然后等我说完之后,面试官给我举了个例子 然后继续让我说
然后我就想到了效率的问题 我说map是红黑树实现的 vector是一段线性的内存 所以map的查找的效率比vector高
但是这还不是面试官想要的结果 然后我就蒙了
现在想想 面试官应该是想让我回答出 map自动排序以及元素不能重复的特点 或者是vector的扩容
所以大家一定要熟悉这些特点 不然到了面试的时候,如果知识不够熟悉 很容易想不起来
总结
vector头部和中间插入和删除效率较低 在尾部插入和删除效率高 支持随机访问
deque是在头部和尾部插入删除效率高,支持随机访问,但是效率没有vector高
list在任意位置插入和删除的效率都高 不支持随机访问
set和map都是红黑树实现,自动排序,每个值出现一次,不许重复 插入删除效率高
如果需要高效的随机存取,不在乎插入删除的效率 使用vector
大量插入删除数据 不关心效率 用list
随机存取,关心两端效率 用deque
如果打算存储数据字典 一对一使用map 一对多使用multimap
如果打算查找一个元素是否存在某个集合中,唯一存在使用set 不存在唯一情况使用multiset
vector在头部和中间的位置插入和删除时间复杂度都是O(n)
在尾部插入和删除时间复杂度为0(1) 查找时间复杂度为O(1)
deque在中间的位置插入和删除时间复杂度都是O(n)
在头部和尾部插入和删除时间复杂度为0(1) 查找时间复杂度为O(1)
list在任何位置插入删除都是O(1) 查找都是O(n)
set map通过红黑树实现,查找 插入 删除都是O(logN)
效率
以上是关于c++STL容器特点以及底层实现的主要内容,如果未能解决你的问题,请参考以下文章