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;  // 触发移动语义
}
posted @ 2025-08-05 23:59  灰灰奋斗录  阅读(10)  评论(0)    收藏  举报