c++ 中的容器 vector 与数组 array

发布时间:2026/8/19 20:41:14
c++ 中的容器 vector 与数组 array 当初自学 c 与 c 语言时一直被指针弄的云里雾里。后来 c 中引入了容器避免了指针。但是一些教材把容器的章节放在书本中后面的章节太不合理。应该把这种方便的功能放到前面这样一些初学者就不会遇到太多生硬难懂的知识点从而对这个语言望而却步了。这篇博客让 AI 总结了相关知识点方便自己以后查阅。总结对于定长数组用 array不定长数组用 vector计算规模巨大实在想优化计算速度用指针文章目录一、 C 中的 std::vector1. std::vector 基本使用(1) 引入 vector 头文件(2) 创建和初始化2. std::vector 的核心方法3. vector 详细示例(1) push_back() 和 pop_back()(2) insert() 和 erase()4. vector 与普通数组的对比5. 总结二、 C 中的 std::array1. std::array 的特点2. std::array 的基本用法(1) 创建与初始化3. std::array 的常用方法4. std::array 方法示例5. std::array 与 C 风格数组的对比6. std::array 在 STL 算法中的使用7. 总结一、 C 中的std::vector在 C 中std::vector是动态数组容器提供了自动扩展、随机访问等功能是std::array和std::list之间的高效选择。std::vector定义在vector头文件中属于STL标准模板库的一部分。1.std::vector基本使用(1) 引入vector头文件#includeiostream#includevectorintmain(){std::vectorintv{1,2,3,4,5};// 遍历 vectorfor(inti:v){std::couti ;}return0;}输出1 2 3 4 5(2) 创建和初始化一般有两种方法用“大小 初始值”初始化std::vectorintv2(5);// 5 个 0 的一维数组std::vectorintv2(5,1);// 5 个 1 的一维数组// 小括号与中括号是不同的std::vectorintv2[5];// 这里表示创建 5 个一维空数组// 创建二维数组比较麻烦下面是 4 行 3 列的二维数组元素值都为 0std::vectorstd::vectordoublev1(4,std::vectordouble(3));// 下面是 4 行 3 列的二维数组每列元素值都为 {1, 2, 3}std::vectorstd::vectordoublev1(4,std::vectordouble{1,2,3});// 创建二维数组还有下面的简便表达std::vectorv1(4,std::vectordouble(3));范围初始化std::vectorintv3{10,20,30};// 列表初始化std::vectorintv5(v3.begin(),v3.end());// 迭代器初始化std::vectorintv5(v3.begin(),v3.begin()2);// 迭代器初始化还有一些例子#includeiostream#includevectorintmain(){std::vectorintv1;// 空 vectorstd::vectorintv2(5);// 5 个 0 的一维数组// 小括号与大括号是不同的std::vectorintv2[5];// 这里表示创建 5 个一维空数组// 创建二维数组比较麻烦下面是 4 行 3 列的二维数组元素值都为 0std::vectorstd::vectordoublev1(4,std::vectordouble(3));// 下面是 4 行 3 列的二维数组每列元素值都为 {1, 2, 3}std::vectorstd::vectordoublev1(4,std::vectordouble{1,2,3});// 创建二维数组还有下面的简便表达std::vectorv1(4,std::vectordouble(3));std::vectorintv2(5,100);// 5 个 100std::vectorintv3{10,20,30};// 列表初始化std::vectorintv4(v3);// 复制 v3std::vectorintv5(v3.begin(),v3.end());// 迭代器初始化for(intx:v2)std::coutx ;// 输出: 100 100 100 100 100}注意数组变量最后用小括号还是中括号是不一样的。若数组为一个类中的属性可以用大括号表示子数组的数量例如下面表示数组里面有两个子数组std::vectorstd::vectorintrecorded_pivot{2};初始化容器也可以使用列表初始化适合固定内容std::vectorstd::vectorintmatrix{{1,2,3},{4,5,6},{7,8,9}};2.std::vector的核心方法方法作用push_back(value)在末尾添加元素pop_back()删除末尾元素size()返回元素个数capacity()返回当前容量resize(n)调整大小可能会丢弃元素clear()清空所有元素empty()判断是否为空insert(it, value)在指定位置插入元素erase(it)删除指定位置的元素front()/back()返回首/尾元素at(i)获取指定索引元素带边界检查operator[]获取指定索引元素无边界检查data()返回指向内部连续存储数组的指针首元素地址3.vector详细示例(1)push_back()和pop_back()#includeiostream#includevectorintmain(){std::vectorintv;v.push_back(1);v.push_back(2);v.push_back(3);std::coutSize: v.size()std::endl;// 3std::coutLast Element: v.back()std::endl;// 3v.pop_back();// 删除 3std::coutSize after pop: v.size()std::endl;// 2}输出Size: 3 Last Element: 3 Size after pop: 2(2)insert()和erase()#includeiostream#includevectorintmain(){std::vectorintv{1,2,3,4,5};v.insert(v.begin()2,99);// 在索引 2 位置插入 99v.erase(v.begin()1);// 删除索引 1 位置的元素for(intx:v)std::coutx ;}输出1 99 3 4 54.vector与普通数组的对比特性std::vector普通数组C-style array大小可变✅自动扩展❌固定大小安全性✅带边界检查 (at())❌无边界检查初始化✅支持列表初始化⚠️手动初始化复制✅支持赋值 ()❌需要memcpy()性能⚠️可能有额外开销✅更快不涉及动态分配STL 支持✅可与std::algorithm配合❌手动实现排序、查找等5. 总结std::vector是 C 动态数组支持自动扩展、插入、删除等功能。比普通数组更安全支持size(),push_back(),insert(),erase()等操作。适用于大部分需要动态管理数组的场景但在高性能需求下可以考虑std::array或std::deque。二、 C 中的std::array在 C 中std::array是STL标准模板库提供的定长数组容器它是std::vector和 C 风格数组 (C-style array) 之间的折中方案提供了更安全且性能优越的数组管理方式。1.std::array的特点特点描述固定大小std::arrayT, N的大小N在编译期确定无法动态改变。支持std::vector风格的接口拥有.size(),.at(),.front(),.back(),.fill()等方法。支持std::algorithm可与std::sort(),std::reverse()等标准库算法配合使用。内存布局与 C 风格数组相同连续存储性能与C-style array相当但更安全。2.std::array的基本用法(1) 创建与初始化#includeiostream#includearrayintmain(){std::arrayint,5arr1{1,2,3,4,5};// 列表初始化std::arrayint,5arr2{0};// 仅初始化第一个元素为 0其余为 0std::arrayint,5arr3{};// 全部初始化为 0for(intnum:arr1)std::coutnum ;// 1 2 3 4 5return0;}3.std::array的常用方法方法作用size()返回数组大小固定值N。at(index)获取指定索引的元素带边界检查。operator[]获取指定索引的元素不带边界检查。front()获取第一个元素。back()获取最后一个元素。fill(value)将所有元素设置为value。swap(other)交换两个std::array的内容。data()返回指向底层数组的指针。4.std::array方法示例#includeiostream#includearrayintmain(){std::arrayint,5arr{10,20,30,40,50};std::coutSize: arr.size()std::endl;// 5std::coutFirst: arr.front()std::endl;// 10std::coutLast: arr.back()std::endl;// 50arr.fill(100);// 全部赋值为 100for(intx:arr)std::coutx ;// 100 100 100 100 100return0;}输出Size: 5 First: 10 Last: 50 100 100 100 100 1005.std::array与 C 风格数组的对比特性std::arrayC 风格数组 (T arr[N])大小固定编译期确定固定编译期确定安全性✅at()带边界检查❌越界访问未定义行为STL 兼容性✅支持std::algorithm❌不兼容 STL拷贝✅支持赋值深拷贝❌数组名是指针不能直接赋值性能✅等同于 C 数组✅等同于std::array获取大小✅.size()❌ 需sizeof(arr)/sizeof(arr[0])6.std::array在 STL 算法中的使用#includeiostream#includearray#includealgorithm// 用于 sort()intmain(){std::arrayint,5arr{30,10,50,20,40};std::sort(arr.begin(),arr.end());// 排序for(intx:arr)std::coutx ;// 10 20 30 40 50}输出10 20 30 40 50✅std::array支持std::sort()、std::reverse()、std::find()等 STL 算法。7. 总结特性std::arraystd::vectorC 风格数组大小可变❌ 否✅ 是❌ 否边界检查✅at()✅at()❌ 否STL 兼容✅ 是✅ 是❌ 否性能✅ 高效⚠️ 可能有额外分配✅ 高效✅如果数组大小固定推荐使用std::array。✅如果数组需要动态扩展使用std::vector。✅C 风格数组适用于对性能要求极高且手动管理数组的情况。你对std::array还有其他问题吗

相关新闻