STL之vector刨析

发布时间:2026/8/29 17:00:31

STL之vector刨析
vector的使用(常用接口)Member functionsConstruct vector(构造)voidtest01(){//构造1;无参构造vectorintv1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);//构造2:10个1vectorintv2(10,1);//构造3:迭代器区间vectorintv3(v1.begin(),v1.end());}//拷贝构造4:vectorintv4(v1);//initializer_list(C11语法)vectorintv5{1,2,3,4,5};Iterators(迭代器)beginendCapacitysizereserve(扩容)预定空间但不改变 sizevectorintv(10,1);// size10, capacity10v.reserve(20);// 申请至少能容纳20个元素的空间coutv.size()endl;// 输出 10size 不变coutv.capacity()endl;// 输出 20reserve(n) 只会增大 capacity不会添加元素所以 size 不变。如果你提前知道要存多少数据用 reserve 一次性开好空间可以避免多次扩容带来的拷贝开销提升性能。reserve 不会缩容v.reserve(5);// 试图缩小容量coutv.capacity()endl;// 依然是 20不会变小resizeresize改变 size可能引发扩容vectorintv(10,1);v.resize(30,2);// 增加到30个元素新增的元素用 2 填充coutv.size()endl;// 30coutv.capacity()endl;// 30可能触发了扩容v.resize(5);// 减少到5个元素多出的被删除coutv.size()endl;// 5coutv.capacity()endl;// 容量不变不会缩容capacityvoidtest02(){vectorintv1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);//遍历1:[]for(size_t i0;iv1.size();i){coutv1[i] ;}coutendl;//范围forfor(autoe:v1){coute ;}coutendl;//迭代器vectorint::iterator itv1.begin();while(it!v1.end()){cout*it ;it;}coutendl;}voidtest03(){vectorintv1(10,1);size_t oldv1.capacity();coutoldendl;for(size_t i0;i100;i){v1.push_back(i);if(v1.capacity()!old){coutv1.capacity()endl;oldv1.capacity();}}//1.5倍扩容//reservev1.reserve(100);//不会缩容//resize(3种情况):与string类似}Element accessoperator越界检查:断言报错at越界检查:抛异常front作用:取第一个数据back作用: 取最后一个数据data作用返回指向 vector 底层连续数组首元素的普通指针 T*Modifierspush_backpop_backinserterasevoidtest04(){vectorintv1(10,1);//push_backv1.push_back(100);//insert//迭代器v1.insert(v1.begin(),1000);//效率低下v1.insert(v1.begin()3,1000);//在下标为3的位置插入//在指定值前插入//find(使用算法库里面的)autoitstd::find(v1.begin(),v1.end(),100);if(it!v1.end()){v1.insert(it,33);}for(autoe:v1){coute ;}coutendl;//erase//头删v1.erase(v1.begin());//删除指定值intx;cinx;auto_itstd::find(v1.begin(),v1.end(),x);if(_it!v1.end()){v1.erase(_it);}for(autoe:v1){coute ;}coutendl;}特殊语法vector vector 作用:动态开辟二维数组//动态开辟二维数组intnumRows;vectorvectorintvv;vv.resize(numRows,vectorint());for(size_t i0;inumRows;i){vv[i].resize(i1,1);}vector的模拟实现(模板:声明和定义不能分离到两个文件)vector.h#define_CRT_SECURE_NO_WARNINGS#pragmaonce#includeiostream#includeassert.husingnamespacestd;//模板:声明和定义不能分离到两个文件namespacemySTL{templateclassTclassvector{public:typedefT*iterator;typedefconstT*const_iterator;//构造函数vector():_start(nullptr),_finish(nullptr),_end_of_storage(nullptr){}//拷贝构造vector(constvectorTv){reserve(v.capacity());for(autoe:v){push_back(e);}}//initializer_listvector(initializer_listTil){reserve(il.size());for(autoe:il){push_back(e);}}//迭代器区间构造/*vector(iterator first, iterator last) { while (first ! last) { push_back(*(first)); first; } }*///函数模板//任意类型容器迭代器初始化templateclassInputIteratorvector(InputIterator first,InputIterator last){while(first!last){push_back(*(first));first;}}//n个val构造/*vector(size_t n, T valT()) { resize(n,val); } *///匹配不上//swapvoidswap(vectorTv){std::swap(_start,v._start);std::swap(_finish,v._finish);std::swap(_end_of_storage,v._end_of_storage);}//vectorToperator(vectorTv){swap(v);return*this;}//扩容voidreserve(size_t n){if(ncapacity()){size_t old_sizesize();//保存旧空间大小,_finish计算要用T*tmpnewT[n];//拷贝旧空间数据到新空间if(_start){//memcpy(tmp, _start, size() * sizeof(T));//无法完成深层次的深拷贝for(size_t i0;iold_size;i){tmp[i]_start[i];//对于string这种类型,赋值调用operator完成深拷贝//对于int,赋值完成浅拷贝}delete[]_start;}_starttmp;_finish_startold_size;_end_of_storage_startn;}}//sizesize_tsize()const{return_finish-_start;}//capacutysize_tcapacity()const{return_end_of_storage-_start;}//[]Toperator[](size_t pos){assert(possize());return_start[pos];}constToperator[](size_t pos)const{assert(possize());return_start[pos];}//迭代器iteratorbegin(){return_start;}const_iteratorbegin()const{return_start;}iteratorend(){return_finish;}const_iteratorend()const{return_finish;}//判空boolempty()const{return_start_finish;}//push_backvoidpush_back(constTx){if(_finish_end_of_storage){reserve(capacity()0?4:2*capacity());}*_finishx;_finish;}//存在浅拷贝问题//memcpy不能深层次深拷贝(string)这种类型//pop_backvoidpop_back(){assert(!empty());--_finish;}//insertvoidinsert(iterator pos,constTx){assert(pos_start);assert(pos_finish);//下面扩容后,可能会发生迭代器失效if(_finish_end_of_storage){size_t newcapacitycapacity()0?4:capacity()*2;reserve(newcapacity);//解决方法就是使用reserve提前扩容size_t lenpos-_start;pos_startlen;}iterator end_finish-1;while(endpos){*(end1)*(end);--end;}*posx;_finish;}//clearvoidclear(){_finish_start;}//eraseiteratorerase(iterator pos){assert(pos_start);assert(pos_finish);//挪动数据iterator startpos;while(start1!_finish){*(start)*(start1);start;}_finish--;returnpos;}//resizevoidresize(size_t n,T valT()){if(nsize()){reserve(n);while(_finish!_startn){*(_finish)val;_finish;}}else{_finish_startn;}}//~vector~vector(){if(_start){delete[]_start;_start_finish_end_of_storagenullptr;}}private:iterator _startnullptr;iterator _finishnullptr;iterator _end_of_storagenullptr;};}test.cpp#define_CRT_SECURE_NO_WARNINGS#includevector.htemplateclassContinervoidPrint(constContinerv){for(autoe:v){coute ;}coutendl;}namespacemySTL{voidtest01(){vectorintv;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.push_back(6);v.pop_back();v.insert(v.end(),88);//在指定值前插入intx;cinx;autoitfind(v.begin(),v.end(),x);if(it!v.end()){v.insert(it,x*10);//it失效?这里it能否继续使用?不能//扩容会导致it失效,但是C标准没有规定vector扩容规则//*it1000;(不要继续使用)}Print(v);v.erase(v.begin());Print(v);//在指定值前删除inty;ciny;auto_itfind(v.begin(),v.end(),y);if(_it!v.end()){v.erase(_it);//it失效?这里it能否继续使用?不能//失效//erase 操作导致元素向前移动pos之后所有元素位置发生变化旧迭代器指向的语义不再合法。标准直接禁止继续使用防止产生难以察觉的 BUG。//库里面有返回值,返回删除位置的下一个位置(更新)}Print(v);v.resize(10);Print(v);vectorintv2{1,2,3,4,5,6,7,8,9,0};Print(v2);vectorintv3(v2.begin()1,v2.end());Print(v3);//vectorint v4(10, 1);//Print(v4);vectorintv5v3;Print(v5);}voidtest02(){vectorstringv1;v1.push_back(hello word);Print(v1);}}intmain(){//mySTL::test01();mySTL::test02();}

相关新闻

IoT定位平台为何选中Nordic模块?从GNSS到蜂窝低功耗的全栈解析

IoT定位平台为何选中Nordic模块?从GNSS到蜂窝低功耗的全栈解析

2026/8/29 17:00:31

Nordic模块进IoT定位平台这件事,我一开始看到新闻标题时其实没太当回事,心想无非又是厂商发了一篇PR稿。但后来细看了一下选型背景,发现这事有点意思——一个做定位平台的公司,在评估了一圈方案之后,最终把Nordic Semi…

STM32WL55低功耗调试实战:Stop 2电流从298uA降到1.7uA

STM32WL55低功耗调试实战:Stop 2电流从298uA降到1.7uA

2026/8/29 17:00:30

如果你的STM32WL55样机在跑LoRa协议栈时功耗高到不敢用电池供电,或者明明已经调用了HAL库的低功耗接口但电流依然停留在几百uA级别,这篇文章大概率能帮你省下几个通宵。最近一个项目里我们遇到的就是这个情况:STM32WL55在Sleep模式下电流一切…

算法面试高分指南:链表反转、二叉树、滑动窗口与动态规划实战

算法面试高分指南:链表反转、二叉树、滑动窗口与动态规划实战

2026/8/29 16:50:30

1. 面试算法题准备的三大误区:先避开这些坑这段时间帮几个朋友做模拟面试,发现一个很有意思的规律:大家刷题量都不少,LeetCode动辄两三百题,但一到白板写题就露馅。不是不会做,而是不知道面试官想听什么、想…

Python Matplotlib 3D曲面图模板函数:提升数据可视化效率

Python Matplotlib 3D曲面图模板函数:提升数据可视化效率

2026/8/29 17:50:33

1. 从零到一:为什么需要一个3D曲面图模板函数? 如果你用过Python的Matplotlib画过几次3D图,尤其是曲面图,大概率会和我有一样的感受:每次都要写一堆重复的样板代码。从导入 Axes3D ,到创建图形和3D坐标轴…

数学建模实战:从线性回归到非线性拟合,如何科学选择模型与避免过拟合

数学建模实战:从线性回归到非线性拟合,如何科学选择模型与避免过拟合

2026/8/29 17:50:33

1. 从“差不多”到“刚刚好”:为什么拟合是数学建模的灵魂搞数学建模的朋友,尤其是刚入门的同学,经常会有个困惑:模型建好了,公式也列出来了,但怎么让这个模型“认”上我的数据呢?总不能每次都靠…

模糊PID控制器硬件实现:基于System Generator的FPGA部署全流程

模糊PID控制器硬件实现:基于System Generator的FPGA部署全流程

2026/8/29 17:50:33

1. 项目概述:当传统PID遇上模糊逻辑与System Generator在工业控制、机器人、无人机乃至智能家居的温控系统里,PID控制器无疑是那个最经典、最核心的“大脑”。它的原理简单直接——根据偏差(P)、偏差的积累(I&#xff…

Shopee 2019校招算法真题复盘:五大高频套路与解题思路

Shopee 2019校招算法真题复盘:五大高频套路与解题思路

2026/8/29 17:50:33

Shopee 2019校招的编程题,放到今天看依旧是一套非常标准的“算法能力体检表”。当年这批题传出来之后,很多刷题群都在分析,结论出奇一致:没有偏题怪题,全是 LeetCode 上被人反复做烂了的经典题型,但加了一些…

基于SpringBoot的摄影约拍系统的设计与实现(程序+文档+讲解)

基于SpringBoot的摄影约拍系统的设计与实现(程序+文档+讲解)

2026/8/29 17:50:33

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

Java Stream API深度解析:从函数式编程到高效数据处理实战

Java Stream API深度解析:从函数式编程到高效数据处理实战

2026/8/29 17:40:32

1. 项目概述:为什么我们需要流式编程? 如果你写过几年Java,肯定对集合操作不陌生。从 List 、 Set 到 Map ,我们每天都在和它们打交道。处理集合数据最常见的方式是什么?没错,就是 for 循环。遍历一…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/29 10:22:10

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/28 7:34:42

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

四款热门降AI工具测评:研究生和本科生怎么选?

四款热门降AI工具测评:研究生和本科生怎么选?

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

论文降AI率免费攻略:自查、提示词与工具推荐

论文降AI率免费攻略:自查、提示词与工具推荐

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

2026/8/29 0:09:39

前言:预算有限的企业更关心投入能否形成可持续的品牌资产。评估北京GEO优化服务商时,不能只比较单篇内容或单月报价,还要看是否能够把问题词、官网、信源和监测串成完整链路。本期重点放在预算配置、试点范围和交付边界,帮助企业先…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…