C++ 容器的核心特性
C++ 标准库容器(如 vector, map, set 等)具有以下重要特性:
1. 内存管理自动化
- 自动内存分配/释放:容器自动管理元素的内存
- 动态扩容:当容量不足时自动重新分配内存(如 vector 的扩容)
- RAII 原则:容器析构时自动释放所有元素内存
std::vector<int> v = {1, 2, 3}; // 自动分配内存
v.push_back(4); // 可能触发扩容
// 离开作用域时自动释放内存
2. 值语义
- 存储元素的副本:默认按值存储(拷贝或移动)
- 可自定义拷贝行为:通过自定义拷贝构造函数/赋值运算符
- 引用存储需包装:使用 std::reference_wrapper 或指针存储引用
std::vector<std::string> names;
names.push_back("Alice"); // 存储字符串副本
3. 迭代器支持
- 统一的元素访问接口:所有容器都提供迭代器
- 五种迭代器类别:
输入/输出迭代器
前向迭代器
双向迭代器(如 list, map)
随机访问迭代器(如 vector, deque)
for(auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
4. 多种访问方式
- 序列容器(如 vector):
operator[]:快速访问(无边界检查)
at():带边界检查(越界抛出异常)
front()/back():首尾元素 - 关联容器(如 map):
find(key):安全查找
operator[]:不存在时插入(仅 map)
at(key):带边界检查
std::map<std::string, int> scores;
scores["Alice"] = 90; // 插入或修改
int score = scores.at("Bob"); // 不存在则抛出异常
5. 时间复杂度保证
-
序列容器:
vector:随机访问 O(1),尾部插入/删除分摊 O(1)
list:任意位置插入/删除 O(1) -
关联容器:
有序(map/set 红黑树):查找 O(log n)
无序(unordered_map 哈希表):查找平均 O(1)
6. 异常安全性
- 基本保证:操作失败时容器仍处于有效状态。
- 强保证:如 vector::push_back 成功或保持原状。
std::vector<int> v = {1, 2, 3};
try {
v.push_back(4); // 若抛出异常,v 仍为 {1,2,3}
} catch (...) {}
7. 容量管理
- 大小查询:size(), empty()
- 预分配:reserve()(vector/string)
- 调整大小:resize(), shrink_to_fit()
8. 移动语义支持(C++11+)
- 移动构造/赋值减少拷贝开销。
- 支持返回容器局部对象(优化为移动而非拷贝)。
std::vector<int> create_vector() {
std::vector<int> v = {1, 2, 3};
return v; // 触发移动语义
}