#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    // 1. 初始化与基本操作
    std::vector<int> nums = {3, 1, 4, 1, 5};  // 初始化
    nums.push_back(9);        // 尾部插入
    nums.pop_back();          // 尾部删除
    
    // 2. 内存管理
    std::cout << "容量: " << nums.capacity() << std::endl;  // 预分配空间
    nums.shrink_to_fit();     // 释放多余内存
    
    // 3. 迭代器遍历
    for (auto it = nums.begin(); it != nums.end(); ++it) {
        std::cout << *it << " ";
    }
    
    // 4. 算法集成
    std::sort(nums.begin(), nums.end());  // 快速排序
    auto pos = std::find(nums.begin(), nums.end(), 4); // 查找元素
    
    // 5. 高级技巧
    std::vector<std::vector<int>> matrix(3, std::vector<int>(4, 0)); // 二维动态数组
}

核心特性解析

  1. 动态扩容

    • 初始容量为0,添加元素时按指数级增长(通常$2^n$)
    • capacity()获取预分配空间,size()获取实际元素数
  2. 内存控制

    vector<int> v;
    v.reserve(1000);  // 预分配空间,避免频繁扩容
    

    使用emplace_back()直接构造元素,减少临时对象复制:

    v.emplace_back(42);  // 优于 push_back(42)
    

  3. 迭代器失效

    操作类型失效情况
    push_back()可能引起全部迭代器失效
    insert()插入点之后迭代器失效
    erase()被删元素之后迭代器失效
  4. 性能对比

    操作时间复杂度说明
    随机访问$O(1)$连续内存优势
    尾部插入$O(1)$均摊复杂度
    中间插入$O(n)$需移动后续元素

最佳实践

  1. 优先用range-based for循环:

    for (const auto& num : nums) {
        // 安全遍历
    }
    

  2. 避免vector<bool>特化版,改用deque<bool>bitset

  3. 移动语义优化大对象传输:

    std::vector<Matrix> data;
    data.push_back(Matrix(1000,1000));  // 触发复制构造
    data.push_back(std::move(Matrix(1000,1000))); // 移动构造
    

应用场景

  1. 动态数据集:替代原生数组,自动管理内存
  2. 中间结果存储:算法处理的临时容器
  3. 矩阵表示:嵌套实现二维结构(需注意内存局部性)

通过data()成员函数可直接访问底层数组:

int* raw_ptr = nums.data(); // C++11起支持

更多推荐