本文将带你穿越C++容器的迷雾森林:从vector动态扩容的数学玄机,到emplace_back比push_back快在哪的微观真相;从红黑树与哈希表的世纪对决,到连续存储背后的内存博弈。无论你是渴望通过大厂面试的技术追梦人,还是致力于优化千万级代码的性能极客,这里都有你意想不到的硬核干货。

简要回答 C++STL中主要有三类容器:
此外,STL还包括配套的迭代器、算法、仿函数、适配器等组件。
详细回答 STL容器可以分为三大类:
每种容器在时间复杂度、内存布局和使用场景下有所不同。
序列容器
容器 | 特点 |
|---|---|
vector | 动态数组,随机访问快,尾部插入快 |
list | 双向链表,任意位置插入/删除快 |
deque | 双端队列,头尾都能快速插入/删除 |
array | 固定大小数组(C++11) |
forward_list | 单向链表(C++11) |
关联容器(有序,就红黑树)
容器 | 特点 |
|---|---|
set | 唯一元素自动排序 |
multiset | 元素允许重复 |
map | 键值对,键唯一 |
multimap | 键值对,键可重复 |
无序关联容器(基于哈希表,C++11)
容器 | 特点 |
|---|---|
unordered_set | 无序唯一集合 |
unordered_map | 无序键值对 |
unordered_multiset | 无序可重复集合 |
unordered_multimap | 无序可重复键值对 |
代码实例:
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <unordered_map>
#include <list>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3};
vec.push_back(4); // 动态数组
list<int> lst = {10, 20, 30};
lst.push_front(5); // 双向链表
set<int> s = {5, 2, 3, 2}; // 自动去重排序
map<string, int> m = {{"Tom", 90}, {"Jerry", 85}}; // 字典
unordered_map<string, int> um;
um["apple"] = 3;
um["banana"] = 5; // 哈希表
return 0;
}知识扩展: STL的底层结构: vector、deque动态数组list、forward_list链表set、map红黑树unordered_*哈希表 性能差异:
使用场景:
2.1. 基本介绍 特性
std::vectorstd::array(C++11 引入)大小动态可变固定不变(编译时确定)内存分配堆(动态分配)栈(静态分配)标准库支持C++98 起就有C++11 起引入元素访问支持下标访问和迭代器同样支持效率稍慢(涉及动态分配)更快(在栈上分配,无需额外开销)
适用于元素数量运行时变化、在末尾频繁插入删除、需要自动扩容的场景:
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums;
for (int i = 0; i < 10; ++i) {
nums.push_back(i); // 动态扩容
}
for (int n : nums) {
std::cout << n << " ";
}
return 0;
}适用于元素数量固定、性能要求高、无需动态扩容的场景:
#include <iostream>
#include <array>
int main() {
std::array<int, 5> nums = {1, 2, 3, 4, 5};
for (int n : nums) {
std::cout << n << " ";
}
return 0;
}2.4. 对比传统数组的优势
vector内部使用动态数组作为底层存储结构,内部使用了一个单一的内存块来存储所有的元素,并且管理这个内存块的大小和容量。当vector的内存容量不够时,会重新分配一块更大的内存,并把旧数组中的数据复制到新内存块中。
vector在空间不足时,会进行扩容。vector内部实现过了一个内存分配函数,内存不够时会申请一块原内存1.5~2倍大小的新内存块,再把旧的数组复制到新的内存当中。 vector扩容时,对于使用移动语义复制对象还是直接拷贝对象,取决于对象是否支持移动语义,实现了移动构造函数
简要回答 两者都用于在末尾添加元素,但是两者添加的元素的方式不同:
详细回答
知识扩展: 性能: