C++ vector容器:从基础到高级的全面指南

一、基础概念

vector 是 C++ 标准库中的序列容器,本质是动态数组:

  • 自动管理内存,支持动态扩容
  • 支持随机访问(时间复杂度 $O(1)$)
  • 连续内存存储,与普通数组兼容
#include <vector>
using namespace std;

二、基本操作
  1. 初始化

    vector<int> v1;               // 空容器
    vector<int> v2(5, 10);        // 5个元素,每个值为10
    vector<int> v3 = {1, 3, 5};   // 初始化列表
    

  2. 元素访问

    v[2] = 7;          // 随机访问(无边界检查)
    v.at(1) = 4;       // 带边界检查(越界抛出异常)
    int first = v.front(); // 首元素
    int last = v.back();   // 末元素
    

  3. 增删元素

    v.push_back(8);     // 尾部插入
    v.pop_back();        // 尾部删除
    v.insert(v.begin()+1, 9); // 指定位置插入
    v.erase(v.begin());  // 删除指定位置
    

三、内存管理
  1. 容量与大小

    • v.size():当前元素数量
    • v.capacity():当前分配的内存容量
    • 扩容规则:通常按 $2^n$ 增长(实现依赖)
  2. 手动控制

    v.reserve(100);     // 预分配100个元素内存
    v.shrink_to_fit();  // 释放多余内存(C++11)
    

四、迭代器与算法
  1. 迭代器操作

    for(auto it = v.begin(); it != v.end(); ++it) {
        cout << *it << " ";
    }
    

  2. STL算法应用

    #include <algorithm>
    sort(v.begin(), v.end());          // 排序
    auto pos = find(v.begin(), v.end(), 5); // 查找
    

五、高级特性
  1. 移动语义(C++11)

    vector<string> v1 = {"a", "bb"};
    vector<string> v2 = move(v1); // 移动构造(零拷贝)
    

  2. 自定义分配器

    template<typename T>
    using CustomAlloc = ...; // 自定义内存分配策略
    vector<int, CustomAlloc<int>> v;
    

  3. 异常安全

    • 基本操作提供强异常保证
    • push_back() 失败时容器状态不变
六、性能优化
  1. 避免频繁扩容

    vector<LargeObj> data;
    data.reserve(10000); // 预先分配避免多次拷贝
    

  2. 高效删除技巧

    // 删除所有奇数(避免移位开销)
    auto new_end = remove_if(v.begin(), v.end(), 
                           [](int x){ return x%2; });
    v.erase(new_end, v.end());
    

  3. 多维向量

    vector<vector<int>> matrix(5, vector<int>(3)); // 5x3矩阵
    

七、应用场景
  1. 替代原始数组
  2. 数据缓存池
  3. 图/树结构的邻接表
  4. 动态数据集合处理

最佳实践:

  • 优先用 emplace_back() 替代 push_back()(避免临时对象)
  • 遍历时用 for(auto& x : v)(引用避免拷贝)
  • 多线程场景需自行加锁
// 综合示例:统计词频
vector<string> words = {"apple", "banana", "apple"};
unordered_map<string, int> freq;
for(const auto& word : words) {
    freq[word]++;
}

通过合理应用 vector,可显著提升程序效率与可维护性。其接口设计遵循 RAII 原则,是 C++ 资源管理的典范实现。

更多推荐