云计算百科
云计算领域专业知识百科平台

C++向量容器完全指南

#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)); // 二维动态数组
}

核心特性解析

  • 动态扩容

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

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

    https://www.zhihu.com/zvideo/1998582288796104068 https://www.zhihu.com/zvideo/1998582329053046048 https://www.zhihu.com/zvideo/1998582383910346988 https://www.zhihu.com/zvideo/1998582543562344416 https://www.zhihu.com/zvideo/1998582600688764754 https://www.zhihu.com/zvideo/1998582639439914429 https://www.zhihu.com/zvideo/1998582679432603583 https://www.zhihu.com/zvideo/1998582765029987496 https://www.zhihu.com/zvideo/1998582803621761159 https://www.zhihu.com/zvideo/1998582803621761159/ https://www.zhihu.com/zvideo/1998582600688764754/ https://www.zhihu.com/zvideo/1998582543562344416/ https://www.zhihu.com/zvideo/1998582288796104068/ https://www.zhihu.com/zvideo/1998582639439914429/ https://www.zhihu.com/zvideo/1998582679432603583/ https://www.zhihu.com/zvideo/1998582329053046048/ https://www.zhihu.com/zvideo/1998582383910346988/ https://www.zhihu.com/zvideo/1998582765029987496/  

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

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

  • 迭代器失效

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

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

  • 优先用range-based for循环:

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

  • 避免vector<bool>特化版,改用deque<bool>或bitset

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

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

    https://www.zhihu.com/zvideo/1998582288796104068 https://www.zhihu.com/zvideo/1998582329053046048 https://www.zhihu.com/zvideo/1998582383910346988 https://www.zhihu.com/zvideo/1998582543562344416 https://www.zhihu.com/zvideo/1998582600688764754 https://www.zhihu.com/zvideo/1998582639439914429 https://www.zhihu.com/zvideo/1998582679432603583 https://www.zhihu.com/zvideo/1998582765029987496 https://www.zhihu.com/zvideo/1998582803621761159 https://www.zhihu.com/zvideo/1998582803621761159/ https://www.zhihu.com/zvideo/1998582600688764754/ https://www.zhihu.com/zvideo/1998582543562344416/ https://www.zhihu.com/zvideo/1998582288796104068/ https://www.zhihu.com/zvideo/1998582639439914429/ https://www.zhihu.com/zvideo/1998582679432603583/ https://www.zhihu.com/zvideo/1998582329053046048/ https://www.zhihu.com/zvideo/1998582383910346988/ https://www.zhihu.com/zvideo/1998582765029987496/  

  • 应用场景

  • 动态数据集:替代原生数组,自动管理内存
  • 中间结果存储:算法处理的临时容器
  • 矩阵表示:嵌套实现二维结构(需注意内存局部性)
  • 通过data()成员函数可直接访问底层数组:

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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » C++向量容器完全指南
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!