std::deque 特性
- 双向队列,队列意味着存储方式不一样,deque不是连续存储的.
- 允许在头尾快速插入或删除,对其他位置的引用对象无影响,不会有copy 发生.(注意,是引用对象,不是指针,指针不需要copy)
- 内部存储会根据需要自动扩展,扩展的代价比vector少很多,因为不会创建新的内存并复制引用.
- 时间复杂度:
1) 随机访问. O(1)
2) 插入和移除头尾元素. O(1)
3) 插入和移除非头尾元素. O(n)
std::vector 特性
- 存储是连续的,因此可以通过枚举或者元素+偏移量来访问,因为Random Access比deque快.
- 内部存储也是根据需要自动扩展的,但是相对静态数组它扩展并非是一个个扩展,而往往是预测扩展多个空间满足以后的添加需要. 当size()> capacity()时会自动扩展,因此在创建vector后,如果能通过reverse来设置容量会提高性能,减少碎片.
扩展时和是否在头尾插入无关. - 只要capacity改变,引用和iterator全部失效,会导致重新copy. (注意,是引用对象,不是指针,指针不需要copy)
- 时间复杂度:
1) 随机访问. O(1)
2) 插入和移除尾部元素. amortized O(1)
3) 插入和移除非尾部元素. linear in distance to the end of the vector O(n)