一、顺序容器全家福 vecto r | deque | lis t | forward_list | array | string 每个容器都有自己的「超能力」和「弱点」,我们通过 六大操作维度 解剖它们!
二、操作详解与支持表 1. 构造与赋值
操作 | vector | deque | list | forward_list | array | string |
---|
C c; | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | C c(n); | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | C c(n, val); | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | C c(begin, end); | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | C c = {a,b,c}; | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | c1 = c2 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | string专属技能: string s = "喵星人"; // 直接字符串字面量初始化
string s(5, 'A'); // "AAAAA"
2. 元素访问
操作 | vector | deque | list | forward_list | array | string |
---|
c.front() | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | c.back() | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | c[n] | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ✔️ | c.at(n) | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ✔️ | c.data() | ✔️ | ❌ | ❌ | ❌ | ✔️ | ✔️ | string特有能力: cout << s[2]; // 访问字符(不检查越界)
cout << s.at(2); // 越界抛异常
cout << s.data(); // 返回C风格字符串(等价c_str())
3. 增删元素
操作 | vector | deque | list | forward_list | array | string |
---|
push_back(val) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ✔️(+= ) | emplace_back(args) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ | pop_back() | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ✔️ | push_front(val) | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ❌ | emplace_front(args) | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ❌ | pop_front() | ❌ | ✔️ | ✔️ | ✔️ | ❌ | ❌ | insert(pos, val) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | emplace(pos, args) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ❌ | erase(pos) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | string专属增删: s += "万岁"; // 尾部追加(等价push_back)
s.append("喵喵", 2); // 追加部分字符串
s.insert(3, "❤️"); // 在位置3插入
s.erase(2, 3); // 从位置2删除3个字符
4. 容量管理
操作 | vector | deque | list | forward_list | array | string |
---|
c.size() | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | c.empty() | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | c.resize(n) | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | c.capacity() | ✔️ | ❌ | ❌ | ❌ | ❌ | ✔️ | c.reserve(n) | ✔️ | ❌ | ❌ | ❌ | ❌ | ✔️ | c.shrink_to_fit() | ✔️ | ✔️ | ❌ | ❌ | ❌ | ✔️ | string容量技巧: s.reserve(100); // 预分配内存(避免频繁扩容)
s.shrink_to_fit(); // 释放多余内存(内存紧张时用)
5. 迭代器与算法
操作 | vector | deque | list | forward_list | array | string |
---|
begin()/end() | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | rbegin()/rend() | ✔️ | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | 算法兼容性 | ✔️ | ✔️ | ❌ | ❌ | ✔️ | ✔️ | string特殊遍历: for (char ch : s) { ... } // 范围for循环
for (auto it = s.rbegin(); it != s.rend(); ++it) { ... } // 反向迭代
6. 专属技能(其他容器没有的!)
容器 | 独门绝技 | 示例 |
---|
string | substr find replace c_str | s.find("喵") s.substr(2) | list | splice merge unique | list1.splice(it, list2) | array | 固定大小,栈内存分配 | array<int,5> arr; | vector | data() 直接访问底层数组 | int* p = vec.data(); | string的杀手锏: size_t pos = s.find("喵星人"); // 查找子串
s.replace(pos, 3, "汪星人"); // 替换子串
const char* cstr = s.c_str(); // 转C风格字符串
三、终极选择指南(含string)
需求 | 推荐容器 | 原因 |
---|
需要随机访问+动态大小 | vector 或 string | 内存连续,访问快 | 高频头部操作 | deque 或 list | deque 支持push_front | 字符串处理 | string | 专为字符串优化 | 中间频繁插入删除 | list | O(1)时间复杂度 | 固定大小数据 | array | 栈内存,无动态分配 | 内存敏感+预分配 | vector /string | reserve减少扩容开销 |
四、灵魂总结
|