STL容器有vector、list、deque、map、multimap、unordered_map、set、multiset和unodered_map,他们之间有什么不同,各自的优缺点是什么,如何选用时适当的容器,这些问题需要去了解。
vector
序列容器,类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,可以在任何位置插入新元素,有随机访问功能,即提供[]操作符,并可以和标准C兼容。在效率方面,任意元素的读取、修改具有常数时间复杂度,在序列尾部进行插入、删除是常数时间复杂度,但在序列的头部插入、删除的时间复杂度是O(n)。此外,当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。
list
序列容器,类似于C语言中的双向链表,它通过指针来进行数据的访问,因此维护的内存空间可以不连续,这有利于数据的随机存取,没有提供 [] 操作符重载。效率方面,任意元素的访问、修改时间复杂度是O(n),插入、删除操作是常数时间复杂度。
deque
序列容器,类似于C语言中的双向队列,即两端都可以插入或者删除的队列,它维护一段连续的内存空间。queue支持 [] 操作符,也就是支持随机存取,而且跟vector的效率相差无几,并且在序列的头部插入和删除操作是常数时间复杂度。
map
关联容器,按照{键,值}方式组成集合,其中键不允许重复,查找的时间复杂度O(logN)。map内部自建一棵红黑树,会对数据自行排序,所以map内部的数据都是有序的。
multimap
关联容器,multimap和map的区别在与一个键可以对应多个值,也就是说键允许重复。
unordered_map
关联容器,和map的区别在于内部实现是hash表,因此其查找速度非常的快。
set
关联容器,set类似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,所以会对数据进行排序,且便于元素查找,查找的时间复杂度是O(logN),而vector是使用连续内存存储,便于随机存取。set不支持下标访问。
multiset
multiset类似于数学里面的集合,和set最大的区别在于集合中可以包含重复的元素。