全网最细vector精讲:从接口使用到迭代器失效、模拟实现,C++面试必看
全网最细vector精讲从接口使用到迭代器失效、模拟实现C面试必看本文专注STL核心vector覆盖面试高频考点、工程避坑、可直接运行代码适合面试突击、期末复习、刷题提速文章目录全网最细vector精讲从接口使用到迭代器失效、模拟实现C面试必看一、开篇vector 到底有多重要二、vector 核心使用高频接口一网打尽1. 四种构造方式2. 迭代器遍历通用写法3. 容量操作面试必考4. 增删查改三、vector 扩容机制面试高频1. 扩容倍数2. 扩容代价3. 优化提前 reserve四、vector 迭代器失效最坑、最易错1. 什么是迭代器失效2. 两类失效场景1扩容导致失效空间被释放2erase 导致失效元素前移3. 平台差异五、vector 模拟实现面试手写1. 核心结构2. reserve 实现重点避开 memcpy 坑3. push_back 实现4. erase 实现处理迭代器失效六、vector 高频面试题总结七、总结一分钟背完一、开篇vector 到底有多重要vector 是C STL 最常用、最基础的动态数组底层是连续内存支持随机访问自动扩容。刷题90% 数组题用 vector工程替代原生数组安全、易用面试扩容机制、迭代器失效、模拟实现 必问它完美解决原生数组定长、越界、管理麻烦的问题是 C 开发者必备技能。二、vector 核心使用高频接口一网打尽1. 四种构造方式#includeiostream#includevectorusingnamespacestd;voidTestVector(){// 1. 无参构造vectorintv1;// 2. 构造n个valvectorintv2(5,10);// 3. 拷贝构造vectorintv3(v2);// 4. 迭代器区间构造intarr[]{1,2,3,4,5};vectorintv4(arr,arr5);}2. 迭代器遍历通用写法vector 迭代器本质就是原生指针 T*高效、轻量。voidTestIterator(){vectorintv{1,2,3,4,5};// 正向迭代器vectorint::iterator itv.begin();while(it!v.end()){cout*it ;it;}coutendl;// 范围for底层替换为迭代器for(autoe:v)coute ;}3. 容量操作面试必考接口作用区别size()获取有效元素个数实际用了多少capacity()获取容量最多能存多少resize(n)改变 size开空间初始化影响有效数据reserve(n)改变 capacity只开空间不影响有效数据voidTestCapacity(){vectorintv;v.reserve(100);// 提前开空间避免频繁扩容v.resize(10,1);// 10个1}4. 增删查改voidTestModify(){vectorintv;// 尾插尾删v.push_back(1);v.push_back(2);v.pop_back();// operator[] 随机访问最常用coutv[0]endl;// insert / erasev.insert(v.begin(),0);v.erase(v.begin());}三、vector 扩容机制面试高频1. 扩容倍数VSPJ 版 STL1.5 倍扩容GSGI 版 STL2 倍扩容2. 扩容代价扩容不是原地追加而是开辟新空间 → 拷贝元素 → 释放旧空间频繁扩容 频繁拷贝 效率暴跌。3. 优化提前 reservevoidTestExpandOpt(){vectorintv;v.reserve(100);// 一次开好无扩容for(inti0;i100;i)v.push_back(i);}四、vector 迭代器失效最坑、最易错1. 什么是迭代器失效vector 迭代器 原生指针。底层空间被释放 / 元素被移动 → 指针变野指针 → 失效。2. 两类失效场景1扩容导致失效空间被释放push_back / insert / resize / reserve / assign都可能触发。// 错误示例vectorintv{1,2,3,4,5};autoitv.begin();v.reserve(100);// 扩容旧空间释放// cout *it endl; // 崩溃it已失效2erase 导致失效元素前移erase 会让迭代器直接失效不能直接 it。// 错误写法删除偶数必崩vectorintv{1,2,3,4};autoitv.begin();while(it!v.end()){if(*it%20)v.erase(it);it;// 失效后未定义行为}// 正确写法接收erase返回值while(it!v.end()){if(*it%20)itv.erase(it);// 更新迭代器elseit;}3. 平台差异VS检查严格失效直接崩溃Linux g检查宽松不崩但结果错误统一原则只要扩容/erase迭代器必须重新获取。五、vector 模拟实现面试手写1. 核心结构底层用三个指针管理_start数据起始_finish有效数据结尾_endOfStorage容量结尾namespacebite{templateclassTclassvector{public:typedefT*iterator;vector():_start(nullptr),_finish(nullptr),_endOfStorage(nullptr){}~vector(){delete[]_start;_start_finish_endOfStoragenullptr;}iteratorbegin(){return_start;}iteratorend(){return_finish;}size_tsize(){return_finish-_start;}size_tcapacity(){return_endOfStorage-_start;}Toperator[](sslocal://flow/file_open?urlsize_tposflow_extraeyJsaW5rX3R5cGUiOiJjb2RlX2ludGVycHJldGVyIn0){return_start[pos];}private:iterator _start;iterator _finish;iterator _endOfStorage;};}2. reserve 实现重点避开 memcpy 坑memcpy 是浅拷贝存放 string/vector 等对象时会重复释放、崩溃。必须用循环深拷贝。voidreserve(size_t n){if(ncapacity()){size_t oldSizesize();T*tmpnewT[n];// 不能用memcpyfor(size_t i0;ioldSize;i)tmp[i]_start[i];delete[]_start;_starttmp;_finish_startoldSize;_endOfStorage_startn;}}3. push_back 实现voidpush_back(constTval){if(_finish_endOfStorage){size_t newCapacitycapacity()0?4:capacity()*2;reserve(newCapacity);}*_finishval;_finish;}4. erase 实现处理迭代器失效iteratorerase(iterator pos){// 向后挪动覆盖for(iterator itpos;itend()-1;it)*it*(it1);--_finish;returnpos;// 返回下一个有效迭代器}六、vector 高频面试题总结vector 扩容倍数VS 1.5 倍Linux 2 倍。resize 和 reserve 区别resize 改 size 并初始化reserve 只改容量。迭代器失效原因扩容释放空间、erase 移动元素。为什么不能用 memcpy 拷贝 vector 元素浅拷贝对象带资源会双重释放、内存泄漏。vector 与 list 区别vector 连续内存、随机访问快list 链表、任意位置增删快。七、总结一分钟背完vector 是连续内存动态数组支持随机访问迭代器原生指针。扩容VS 1.5 倍、G 2 倍用reserve提前优化。迭代器失效是最大坑扩容/erase 后必须重新获取。模拟实现核心三指针 深拷贝禁止 memcpy。刷题首选 vector工程替代数组安全高效。