C++中的容器
一、序列容器(Sequence Containers)
存储元素的线性序列,支持按顺序访问。
-
vector
- 特点:动态数组,支持快速随机访问(O(1)),尾部插入/删除高效(O(1)),中间插入/删除效率低(O(n))。
- 应用场景:
- 需要动态调整大小(如读取未知数量的数据)。
- 频繁随机访问元素(如数组式操作)。
- 示例:存储实时传感器数据、实现动态列表。
-
list
- 特点:双向链表,任意位置插入/删除高效(O(1)),不支持随机访问(需遍历,O(n))。
- 应用场景:
- 频繁在中间插入/删除元素(如实现LRU缓存)。
- 需要合并、拆分链表的高效操作。
- 示例:任务调度队列、需要频繁修改的中间数据。
-
deque
(双端队列)- 特点:类似
vector
,但支持高效的头尾插入/删除(O(1)),内存分段存储。 - 应用场景:
- 需要两端操作(如队列或滑动窗口)。
- 示例:实现消息队列、实时数据缓冲区。
- 特点:类似
-
array
(C++11)- 特点:固定大小的数组,比内置数组更安全(支持迭代器和STL算法)。
- 应用场景:
- 已知固定大小的数据存储(如存储配置参数)。
- 需要高性能且无需动态扩容的场景。
-
forward_list
(C++11)- 特点:单向链表,仅支持前向遍历,比
list
更省内存,但功能更少。 - 应用场景:
- 内存敏感的场景(如嵌入式系统)。
- 只需单向遍历且频繁插入/删除(如哈希表的链式存储)。
- 特点:单向链表,仅支持前向遍历,比
二、关联容器(Associative Containers)
基于键(Key)有序存储,支持快速查找(通常用红黑树实现)。
-
set
- 特点:唯一键的有序集合,自动排序,查找复杂度为 O(log n)。
- 应用场景:
- 需要去重且有序的数据(如存储用户ID)。
- 示例:黑名单过滤、有序事件集合。
-
multiset
- 特点:允许重复键的有序集合,其他与
set
相同。 - 应用场景:需要有序但允许重复键的场景(如统计得分排名)。
- 特点:允许重复键的有序集合,其他与
-
map
- 特点:键值对的有序集合,键唯一,自动排序。
- 应用场景:
- 字典式数据(如配置文件键值对)。
- 示例:存储学生ID到姓名的映射。
-
multimap
- 特点:允许重复键的有序键值对集合。
- 应用场景:
- 一键多值的映射(如日志按时间戳分类)。
三、无序关联容器(Unordered Associative Containers)
基于哈希表实现,键无序但查找更快(平均 O(1))。
-
unordered_set
- 特点:唯一键的无序集合,依赖哈希函数。
- 应用场景:
- 快速去重且无需顺序(如缓存快速查找)。
- 示例:URL去重、实时数据过滤。
-
unordered_multiset
- 特点:允许重复键的无序集合。
- 应用场景:统计高频数据(如词频统计)。
-
unordered_map
- 特点:键值对的无序集合,键唯一。
- 应用场景:
- 快速键值查找(如数据库索引)。
- 示例:用户会话存储、缓存系统。
-
unordered_multimap
- 特点:允许重复键的无序键值对集合。
- 应用场景:一键多值的快速存储(如IP地址到多个端口的映射)。
四、容器适配器(Container Adapters)
基于其他容器实现的特定数据结构接口。
-
stack(栈)
- 底层容器:默认
deque
,也可用vector
或list
。 - 特点:后进先出(LIFO)。
- 应用场景:函数调用栈、撤销操作(Undo)。
- 底层容器:默认
-
queue(队列)
- 底层容器:默认
deque
,也可用list
。 - 特点:先进先出(FIFO)。
- 应用场景:任务队列、消息传递。
- 底层容器:默认
-
priority_queue(堆)
- 底层容器:默认
vector
,基于堆实现。 - 特点:元素按优先级出队(最高优先级先出)。
- 应用场景:任务调度(如操作系统进程调度)、实时数据处理。
- 底层容器:默认
五、其他容器
-
string
- 特点:专为字符串设计的容器,支持类似
vector
的操作。 - 应用场景:文本处理、字符串拼接/解析。
- 特点:专为字符串设计的容器,支持类似
-
bitset
- 特点:固定大小的位序列,支持位操作。
- 应用场景:标志位存储、位掩码操作(如权限管理)。