vector的基本概念vector是C标准模板库(STL)中最重要且最常用的容器之一它本质上是一个封装了动态数组的类模板提供了一系列便捷的方法来操作和管理数组数据。作为序列式容器的一种vector支持在尾部高效地添加或删除元素同时保持元素的线性存储顺序。vector的实现原理是基于动态数组它在内部使用连续的内存空间来存储元素。当现有容量不足时vector会自动重新分配更大的内存空间通常是当前容量的2倍并将原有元素复制到新的内存区域。这个特性使得vector具有以下特点随机访问效率高通过下标运算符[]或at()方法可以在O(1)时间内访问任意元素尾部操作高效push_back()和pop_back()操作的时间复杂度为O(1)插入删除效率低在中间位置插入或删除元素需要移动后续元素时间复杂度为O(n)vector的典型使用场景包括需要频繁随机访问元素的场合数据量变化不大或主要在尾部增删的场合需要兼容C风格数组的场合基本操作示例12345678#include vectorusingnamespacestd;vectorint v;// 创建空vectorv.push_back(10);// 尾部添加元素v.insert(v.begin(), 5);// 在头部插入元素intval v[0];// 随机访问v.pop_back();// 删除尾部元素vector还提供了许多有用的成员函数如size()获取元素数量capacity()获取当前容量reserve()预分配内存等这些函数使得vector比原始数组更安全、更易于使用。与传统静态数组的比较与传统的静态数组相比vector具有以下显著优势动态扩容能力当元素数量超过当前容量时vector会自动分配更大的内存空间(通常是当前容量的1.5-2倍)并将原有元素拷贝到新空间扩容策略可以通过reserve()方法预先指定减少频繁扩容带来的性能开销示例vectorint v; v.reserve(100);预先分配100个元素的空间自动内存管理用户无需手动分配和释放内存vector会在析构时自动释放所有内存遵循RAII(资源获取即初始化)原则避免内存泄漏示例{ vectorint temp; /*...*/ }作用域结束时自动释放内存丰富的成员函数提供了push_back()、pop_back()、insert()、erase()等方法来方便地增删元素支持size()、capacity()、empty()等状态查询方法提供front()、back()快速访问首尾元素的方法随机访问支持通过[]运算符或at()方法可以像普通数组一样快速访问任意位置的元素时间复杂度为O(1)与静态数组相同示例v[10] 42;或int x v.at(5);常用操作示例12345678910111213141516171819202122232425#include vector#include iostreamintmain() {// 创建vectorstd::vectorint numbers;// 尾部添加元素numbers.push_back(10);numbers.push_back(20);numbers.push_back(30);// 访问元素std::cout 第一个元素: numbers[0] std::endl;// 遍历元素for(intnum : numbers) {std::cout num ;}// 删除尾部元素numbers.pop_back();return0;}实际应用场景在实际应用中vector常用于以下场景需要频繁在尾部添加/删除元素的场合日志记录系统数据采集缓冲动态生成的结果集存储需要随机访问元素的场合图像像素处理数学向量/矩阵运算游戏对象管理无法预先确定元素数量的情况读取未知长度的用户输入解析动态数据文件数据库查询结果存储需要将数据作为参数传递给函数时避免数组退化为指针保持完整的容器信息(size/capacity等)示例void process(const std::vectorint data);例如12345678910111213141516171819202122#include vector#include iostreamintmain() {std::vectorint nums;// 创建一个空的int型vector// 添加元素nums.push_back(10);nums.push_back(20);nums.push_back(30);// 访问元素std::cout 第一个元素 nums[0] std::endl;std::cout 当前容量 nums.capacity() std::endl;// 遍历元素for(auto num : nums) {std::cout num ;}return0;}需要注意的是虽然vector提供了诸多便利但在中间位置插入/删除元素时效率较低(O(n)复杂度)这种情况下可以考虑使用list等其他容器。此外频繁的扩容操作也可能带来性能开销可以通过reserve()方法预先分配足够空间来优化。基本特性动态扩容机制当vector的size达到capacity时会自动进行扩容扩容策略大多数实现采用1.5倍或2倍扩容策略如VS通常1.5倍g通常2倍扩容过程分配新内存→拷贝元素→释放旧内存时间复杂度均摊O(1)但单次扩容可能达到O(n)1234vectorint v;for(inti0; i100; i){v.push_back(i);// 自动扩容约7-8次(取决于实现)}内存布局连续存储所有元素在内存中连续排列与普通数组一致随机访问支持通过下标直接访问效率与数组相同迭代器提供随机访问迭代器支持各种STL算法类型安全通过模板实现可存储任意类型123vectorstring names;vectorpairint,double measurements;vectorvectorint matrix;// 二维数组常用操作详解初始化方式123456789101112131415// 1. 默认构造vectorint v1;// 2. 指定大小和初始值vectorint v2(10, 0);// 10个0// 3. 通过迭代器范围初始化intarr[] {1,2,3};vectorint v3(arr, arr3);// 4. 列表初始化(C11)vectorint v4 {1,2,3};// 5. 拷贝构造vectorint v5(v4);元素添加123456789101112vectorint v;// 尾部添加v.push_back(10);v.push_back(20);// 高效构造(C11)v.emplace_back(30);// 直接在容器内构造避免拷贝// 任意位置插入v.insert(v.begin(), 5);// 头部插入v.insert(v.begin()1, 2, 8);// 插入2个8元素访问123456789101112131415161718192021222324// 下标访问(不检查边界)inta v[0];// 安全访问(检查边界)try{intb v.at(100);// 抛出out_of_range异常}catch(out_of_range e) {cerr e.what() endl;}// 迭代器访问for(auto it v.begin(); it ! v.end(); it) {cout *it ;}// 反向迭代器for(auto rit v.rbegin(); rit ! v.rend(); rit) {cout *rit ;}// C11范围forfor(intnum : v) {cout num ;}元素删除123456789101112131415// 删除末尾元素v.pop_back();// 删除指定位置v.erase(v.begin());// 删除范围v.erase(v.begin(), v.begin()2);// 条件删除(C11)v.erase(remove_if(v.begin(), v.end(),[](intx){returnx%20;}), v.end());// 清空容器v.clear();容量管理1234567891011121314151617181920// 当前元素数量size_tcount v.size();// 当前容量size_tcap v.capacity();// 是否为空if(v.empty()) {cout Vector is empty endl;}// 预分配空间(避免多次扩容)v.reserve(100);// 释放多余空间v.shrink_to_fit();// 调整大小v.resize(50);// 不足补0多余删除v.resize(100, -1);// 不足补-1性能优化建议预分配空间已知元素数量时先reserve避免多次扩容12345vectorint v;v.reserve(1000);// 预先分配for(inti0; i1000; i) {v.push_back(i);// 不会触发扩容}选择合适的添加方法优先使用emplace_back而非push_back避免临时对象批量插入时使用insert范围版本避免不必要的拷贝123456// 返回vector的函数vectorint getData() {vectorint data;// ...填充datareturndata;// 移动语义优化无拷贝}元素类型选择存储大型对象时考虑存储指针频繁插入删除时考虑list或deque典型应用场景动态数组需求123456// 读取未知数量的输入vectorint inputs;intnum;while(cin num) {inputs.push_back(num);}实现栈结构1234vectorint stack;stack.push_back(1);// pushinttop stack.back();// topstack.pop_back();// pop矩阵运算12vectorvectordouble matrix(m, vectordouble(n));// 矩阵操作...算法容器123vectorint data {5,3,8,1,9};sort(data.begin(), data.end());auto it find(data.begin(), data.end(), 8);缓存数据12vectorCacheEntry cache;cache.reserve(MAX_CACHE_SIZE);与其他容器对比特性vectordequelist随机访问O(1)O(1)O(n)头部插入O(n)O(1)O(1)尾部插入O(1)O(1)O(1)中间插入O(n)O(n)O(1)内存连续性是部分否vector是C标准模板库(STSL)中最基础也是最重要的序列容器它通过类模板的方式实现了一个动态数组。与普通数组相比vector具有自动内存管理的特性能够根据元素数量的变化动态调整存储空间。内存管理机制初始分配vector在构造时通常会分配一个初始容量具体实现可能不同常见为0或一个小值扩容策略当元素数量超过当前容量时vector会进行扩容。标准没有规定具体扩容倍数但主流实现如GCC、MSVC通常采用2倍扩容策略内存释放除非调用shrink_to_fit()否则vector通常不会自动缩小容量