C++ STL(Standard Template Library)中主要提供了三大类通用容器,用于存储和管理不同类型和结构的数据。它们分别是:
STL 容器总览
[tr]容器类别容器说明[/tr]序列式容器 (Sequence Containers) | vector, deque, list, forward_list, array | 元素按插入顺序排列,类似数组 | 关联式容器 (Associative Containers) | set, map, multiset, multimap | 自动排序,基于平衡树(红黑树) | 无序关联容器 (Unordered Associative Containers) | unordered_set, unordered_map, unordered_multiset, unordered_multimap | 无序哈希表,查找插入效率高 | 容器适配器 (Container Adapters) | stack, queue, priority_queue | 封装其他容器,提供特定行为 | 序列式容器(有顺序,按位置存储)
[tr]容器名特点常见用途[/tr]vector | 动态数组,支持随机访问,尾部插入快 | 默认首选容器,替代 C 数组 | deque | 双端队列,支持首尾插入删除 | 双端栈、滚动窗口 | list | 双向链表,插入删除快,不能随机访问 | 频繁插入/删除位置稳定 | forward_list | 单向链表,内存更小(C++11) | 内嵌链表、只需前向遍历 | array | 定长数组,封装 C 风格数组(C++11) | 栈上存储,性能好,长度固定 | 一、序列式容器特性对比速查表
[tr]特性维度vectorarraydequelistforward_list[/tr]底层结构 | 动态数组(连续内存) | 静态数组(连续内存) | 分段数组 | 双向链表 | 单向链表 | 大小可变 | ✅ 是 | ❌ 否 | ✅ 是 | ✅ 是 | ✅ 是(无 size()) | 下标访问 ([], at()) | ✅ 支持 | ✅ 支持 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 | 头部操作 (push_front) | ❌ 慢(需移动) | ❌ | ✅ 高效 | ✅ 高效 | ✅ 高效 | 尾部操作 (push_back) | ✅ 高效 | ❌ | ✅ 高效 | ✅ 高效 | ❌ 无此接口 | 中间插入/删除 | ❌ 慢(移动元素) | ❌ | ⚠️ 中等偏慢 | ✅ 高效 | ✅ 但不方便 | 空间管理函数 | ✅ reserve()、shrink_to_fit() | ❌ | ❌ | ❌ | ❌ | 支持 data() | ✅ | ✅ | ✅(C++17 起) | ❌ | ❌ | 支持 size() | ✅ | ✅ | ✅ | ✅ | ❌(需手动计数) | 迭代器类型 | 随机访问 | 随机访问 | 随机访问 | 双向 | 单向(forward only) | STL算法兼容性 | ✅ 全兼容 | ✅ 全兼容 | ✅ 全兼容 | ⚠️ 不能用 std::sort() | 同左 | 稳定性(指针/引用稳定) | ❌ 增删会失效 | ✅ | ❌ | ✅ 稳定 | ✅ 稳定 | 排序支持 | std::sort() | std::sort() | std::sort() | .sort()(成员函数) | .sort() | 内存分配位置 | 堆 | 栈 | 堆(分段) | 堆(节点) | 堆(节点) | 适用场景 | 随机访问、连续优化、频繁尾部插入 | 定长数组替代品、轻量 | 双端队列、滑动窗口 | 频繁中间修改 | 单向处理流、大量前插、轻量链表 | deque 内存分块不支持空间管理函数,vector 是一片连续的内存,支持 data()、reserve()、shrink_to_fit() 等内存操作;
list 和forward_list内部结构是链表,没有下标操作,链表自带排序api;
array 在编译时就确定了大小,不能动态改变元素的数量,内存分配在栈上;
- vector:适合连续内存优化,支持 data()、reserve()、shrink_to_fit() 等内存操作,尾部插入效率高,但头部和中间插入较慢。
- array:固定大小的轻量容器,栈上分配,支持下标访问和 data(),不支持任何动态操作。
- deque:支持头部和尾部插入操作,适合双端队列场景,但不支持空间管理函数,底层为分段内存结构。
- list:双向链表容器,适合频繁的中间插入和删除,元素地址稳定,但不支持下标访问,也不能用 std::sort()(需要用成员 sort())。
- forward_list:单向链表容器,接口更轻量,不支持尾部插入和 size(),只能使用 insert_after() / erase_after() 等后置操作,适合嵌入式或轻量场景。
二、共性 API 总结
几乎所有序列式容器都支持如下操作(但有些容器支持受限):
[tr]类别API说明[/tr]容器大小 | size() | 返回当前元素个数 | | empty() | 是否为空 | | max_size() | 可容纳最大元素数 | 元素访问 | front() / back() | 返回头/尾元素(不能用于 forward_list 的 back()) | 迭代器 | begin() / end() | 常规迭代器 | | cbegin() / cend() | const 版本 | | rbegin() / rend() | 反向迭代器 | 修改操作 | insert() | 插入元素(forward_list 仅支持 after) | | erase() | 删除元素(forward_list 仅支持 after) | | push_back() / pop_back() | 尾部插入/删除(forward_list 无) | | push_front() / pop_front() | 头部插入/删除(vector 无) | | clear() | 清空容器 | | resize() | 改变大小 | 其他 | swap() | 交换两个容器 | | assign() | 批量赋值(如指定区间或重复值) | 二、每个容器详细 API + 特性对比
1. vector
- std::vector 是一个动态数组容器
- 元素连续存储,支持随机访问
- 尾部插入/删除效率高,插入中间位置效率较低
std::vector 的常用构造函数构造函数
[tr]构造函数说明[/tr]vector() | 默认构造,空容器 | vector(size_t n) | 创建含 n 个默认值元素的容器 | vector(size_t n, const T& val) | 创建含 n 个值为 val 的元素 | vector(initializer_list) | 使用花括号初始化列表构造(C++11) | vector(iter1, iter2) | 通过迭代器区间构造 | vector(const vector& other) | 拷贝构造 | vector(vector&& other) | 移动构造(C++11) | 具体例子:
[tr]构造方式示例说明[/tr]默认构造 | vector v; | 创建空容器 | 指定大小 | vector v(5); | 创建 5 个默认元素(0) | 指定大小和值 | vector v(3, 9); | 创建 3 个值为 9 的元素 | 初始化列表 | vector v = {1, 2}; | 推荐用法,清晰直观 | 区间构造 | vector v(v2.begin(), v2.end()); | 从其他容器复制子区间 | 拷贝构造 | vector v(v2); | 拷贝另一个 vector | 移动构造 | vector v(std::move(v2)); | 高效转移所有权(C++11) | 示例代码:
[code]#include <vector>#include <vector>int main() { // 1. 默认构造 std::vector v1; std::cout |