1. Sequence Containers:维持顺序的容器
1.1 vector
插入:O(N)
随机查看:O(1)
删除:O(N)
1.2 list
双向链表
插入:O(1)
随机查看:O(N)
删除:O(1)
1.3 deque
双端队列
插入:O(N)
随机查看:O(1)
删除:O(N)
2. Container Adaptors:基于其它容器实现的数据结构
2.1 stack
栈基于 deque 实现
插入:O(1)
查看栈顶:O(1)
删除:O(1)
缺点:只能后进先出,不能随机删改查询
2.2 queue
队列基于 deque 实现
插入:O(1)
查看队首:O(1)
删除:O(1)
缺点:只能先进先出,不能随机删改查询
2.3 priority_queue
优先队列基于 vector、heap实现
插入:O(logN)
查看最值:O(1)
删除:O(logN)
3. Associative Containers:实现了排好序的数据结构
3.1 set、multiset、map、multimap
上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为:
插入:O(logN)
查看:O(logN)
删除:O(logN)
4. Unordered Associative Containers:对每个 Associative Containers 实现了哈希版本
4.1 unordered_set、unordered_multiset、unordered_map、unordered_multimap
上述四种容器采用哈希表实现,不同操作的时间复杂度为:
插入:O(1),最坏情况O(N)。
查看:O(1),最坏情况O(N)。
删除:O(1),最坏情况O(N)。
记住,如果你采用合适的哈希函数,你可能永远不会看到最坏情况。但是记住这一点是有必要的。
5. 总结
1) 如果需要随机访问,用vector
2) 如果存储元素的数目已知,用vector
3) 需要任意位置随机插入删除,用list
4) 只有需要更多在容器的首部尾部插入删除元素,用deque
5) 如果需要在一组动态的数据中随时取最值,用priority_queue
6) 如果操作是基于键值,用set map
7)stack更适用于DFS,queue更适用于BFS