发布时间:2026/9/2 6:59:13
C++初阶——vector 目录一 vector的介绍及使用1、vector的介绍2、vector的使用二 vector在OJ中的使用三 vector深度剖析及模拟实现一、vector的介绍及使用1、vector的介绍std::vector是动态顺序数组底层是一块连续堆内存会自动扩容下标随机访问O(1)2、vector的使用1.2.1 vector的构造可以不传参构造可以构造并初始化n个valval类型是第一个模板参数可拷贝构造可使用迭代器进行初始化构造//无参构造vectorintv1;vectorstringv2;//构造并初始化n个valvectorintv3(10,1);//拷贝构造vectorintv4(v3);//用迭代器初始化构造vectorintv5(v3.begin(),v3.end());1.2.2 vector iterator的使用这里vector的迭代器与string的迭代器大致相同而且由于范围for底层有迭代器实现所以范围for也适用于vector//initializer_list也可以用来初始化vector,initializer_list有迭代器//{...}先传给initializer_list再用范围for将里面的值赋值到v中vectorintv{1,2,3,4,5,6,7,8,9,10};constvectorintconst_v{1,2,3};for(vectorint::iterator it1v.begin();it1!v.end();it1){cout*it1 ;}coutendl;for(vectorint::const_iterator it2const_v.begin();it2!const_v.end();it2){cout*it2 ;}coutendl;//倒着遍历for(vectorint::const_reverse_iterator it3const_v.crbegin();it3!const_v.crend();it3){cout*it3 ;}1.2.3 vector空间增长问题size_type size() const;获取数据个数size_type capacity() const;获取容量大小bool empty() const;判断是否为空void resize (size_type n, value_type val value_type());改变vector的sizevoid reserve (size_type n);改变vector的capacity1.2.4 vector增删查改void push_back (const value_type val);尾插void pop_back();尾删template class InputIterator, class TInputIterator find (InputIterator first, InputIterator last, const T val);查找在算法模块不是vector的成员函数iterator insert (iterator position, const value_type val);在position位置前插入valiterator erase (iterator position);删除position位置数据void swap (vector x);交换两个vector的数据空间reference operator[] (size_type n);像数组一样访问vectorvectorintv;intold_capacityv.capacity();coutold_capacityendl;for(inti1;i100;i){v.push_back(i);if(v.capacity()!old_capacity){old_capacityv.capacity();coutold_capacityendl;}}v.insert(find(v.begin(),v.end(),10),{1,2});for(autoe:v){coute ;}coutendl;intnum;cinnum;v.erase(find(v.begin(),v.end(),num));for(autoe:v){coute ;}二、vector在OJ中的使用2.1 只出现一次的数字只出现一次的数字intsingleNumber(vectorintnums){//0与任何数异或的结果都是任何数intn0;for(autoe:nums){n^e;}returnn;}2.2 杨辉三角OJ杨辉三角OJvectorvectorintgenerate(intnumRows){vectorvectorintvv;vv.resize(numRows,vectorint());for(inti0;inumRows;i){vv[i].resize(i1,1);}//从第三行第二列开始初始化for(inti2;ivv.size();i){for(intj1;jvv[i].size()-1;j)vv[i][j]vv[i-1][j]vv[i-1][j-1];}returnvv;}2.3 删除排序数组中的重复项删除排序数组中的重复项intremoveDuplicates(vectorintnums){if(nums.size()1)return1;intdst0,src1;while(srcnums.size()){if(nums[src]nums[dst])nums[dst]nums[src];src;}returndst1;}2.4 只出现一次的数II只出现一次的数IIintsingleNumber(vectorintnums){mapint,intmp;for(constautoe:nums){mp[e];}intans;for(autot:mp){if(t.second1){anst.first;break;}}returnans;}2.5 只出现一次的数字III只出现一次的数字IIIvectorintsingleNumber(vectorintnums){vectorintans;mapint,intmp;for(autoe:nums){mp[e];}intcnt0;for(autot:mp){if(t.second1){ans.push_back(t.first);cnt;}if(cnt2)break;}returnans;}2.6 数组中出现次数超过一半的数字数组中出现次数超过一半的数字intMoreThanHalfNum_Solution(vectorintnumbers){// write code heresort(numbers.begin(),numbers.end());returnnumbers[numbers.size()/2];}2.7 电话号码字母组合电话号码字母组合classSolution{public:vectorstringans;string ret;vectorvectorcharvv{{a,b,c},{d,e,f},{g,h,i},{j,k,l},{m,n,o},{p,q,r,s},{t,u,v},{w,x,y,z}};voiddfs(stringdigits,intpos){if(posdigits.size()){ans.push_back(ret);return;}intndigits[pos]-2;for(intj0;jvv[n].size();j){ret.push_back(vv[n][j]);dfs(digits,pos1);ret.pop_back();}}vectorstringletterCombinations(string digits){dfs(digits,0);returnans;}};三 vector深度剖析及模拟实现迭代器失效问题迭代器的主要作用就是让算法能够不关心底层数据结构其底层实际是一个指针。因此迭代器失效实际是迭代器底层对应指针指向的空间被销毁了使用一块已经被销毁的空间会使程序崩溃。1.会使迭代器失效的操作有会引起其底层空间改变的操作都有可能使迭代器失效比如resize、reserve、insert、assign、push_back等2.erase操作在vs环境下会对失效的迭代器进行严格检查所以在erase操作后应更新迭代器。而在Linux下g对迭代器失效检测并不非常严格但为保证代码的可移植性最好要更新迭代器3.与vector类似string在进行插入扩容操作后迭代器也会失效扩容时将原数据拷贝进新空间时的操作不能使用memcpy因为当vector中存储的是自定义类型时如string类型memcpy只会进行浅拷贝将存储数据的_str地址拷贝过来而释放原空间资源时_str已被销毁因此要调用深拷贝的拷贝构造将原数据拷贝进新空间。vector.h:#pragmaonce#includeiostream#includecassert#includeutility#includestring#includetype_traitsusingnamespacestd;namespacemyspace{templateclassTclassvector{public:typedefT*iterator;typedefconstT*const_iterator;iteratorbegin(){return_start;}iteratorend(){return_finish;}const_iteratorcbegin(){return_start;}const_iteratorcend(){return_finish;}vector()default;vector(vectorTv){reserve(v.capacity());for(autoe:v){*_finishe;_finish;}}vector(initializer_listTil){reserve(il.size());for(autoe:il){push_back(e);}}templateclassInputIterator,classtypenameenable_if!is_integralInputIterator::value::typevector(InputIterator first,InputIterator last){iterator itfirst;while(it!last){push_back(*it);it;}}vector(size_t n,constTvalT()){reserve(n);while(_finish!_startn){*_finishval;_finish;}}~vector(){delete[]_start;_finish_endofstorage_startnullptr;}vectorToperator(vectorTtmp){swap(tmp);return*this;}size_tsize(){return_finish-_start;}size_tcapacity(){return_endofstorage-_start;}voidreserve(size_t n){if(ncapacity()){size_t old_sizesize();T*tmpnewT[n];for(size_t i0;iold_size;i){tmp[i]_start[i];}delete[]_start;_starttmp;_finish_startold_size;_endofstorage_startn;}}voidresize(size_t n,constTxT()){if(nsize()){reserve(n);while(size()n){*_finishx;_finish;}}else{_finish_startn;}}constToperator[](size_t pos)const{assert(possize());return_start[pos];}Toperator[](size_t pos){assert(possize());return_start[pos];}boolempty(){return_finish_start;}voidpush_back(constTx){if(_finish_endofstorage){reserve(capacity()0?4:capacity()*2);}*_finishx;_finish;}voidpop_back(){assert(size()0);--_finish;}iteratorinsert(iterator pos,constTval){assert(pos_start);assert(pos_finish);if(_finish_endofstorage){intsubpos-_start;reserve(capacity()0?4:capacity()*2);pos_startsub;}iterator end_finish;while(end!pos){*end*(end-1);end--;}*posval;_finish;returnpos;}iteratorerase(iterator pos){assert(pos_start);assert(pos_finish);iterator endpos;while(end!_finish-1){*end*(end1);end;}--_finish;returnpos;}voidclear(){_finish_start;}voidswap(vectorv){std::swap(_start,v._start);std::swap(_finish,v._finish);std::swap(_endofstorage,v._endofstorage);}private:T*_startnullptr;T*_finishnullptr;T*_endofstoragenullptr;};}test.cpp:#includevector.hnamespacemyspace{templateclassContainervoidPrint(Containerv){for(autoe:v){coute ;}coutendl;}voidtest01(){vectorintv;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);v.pop_back();vectorintv2{1,2,3,4,5,6};v2.insert(v2.begin()3,100);Print(v);Print(v2);//删除v2中的偶数for(vectorint::iterator itv2.begin();it!v2.end();){if((*it)%20){//防止it迭代器失效要更新迭代器itv2.erase(it);}elseit;}Print(v2);vectorintv3(v2.begin(),v2.end()-1);Print(v3);vectorintv4(5,5);Print(v4);v4v3;Print(v4);coutv4.size()endl;v4.resize(10);coutv4.size()endl;}voidtest02(){vectorstringv;v.push_back(11111);v.push_back(11111);v.push_back(11111);v.push_back(11111);v.push_back(11111);Print(v);}}intmain(){myspace::test02();return0;}

相关新闻

2026/9/2 6:59:13

DeepEvidence: Empowering Biomedical Discovery with Deep Knowledge Graph Research——通过深度知识图谱研究赋能生物医学发现

DeepEvidence 是一个专门针对生物医学知识图谱设计的“深度研究”AI智能体框架,旨在解决生物医学知识分散、异构、难以整合的痛点,通过系统化的知识图谱探索和推理,加速从药物发现到临床应用的完整生物医学研究生命周期。 一、研究背景与问题…

2026/9/2 6:59:13

【Day 11】Agent做错了怎么办?让它自己检查

摘要 try-except只能捕获代码崩溃,发现不了逻辑错误。本文实现Reflexion模式:执行后LLM自我评估,不通过则反思错因并存入记忆,带着反思重试。核心约80行,免费运行。 你让Agent算购物总价:3本书每本45元、2…

2026/9/2 6:59:13

Android条码扫描Demo:集成CameraX与ML Kit实现

简介:面向Android开发者的条码扫描集成示例,基于ZXing开源库,附带完整可运行的扫码项目。Demo覆盖从相机预览、条码检测到解码返回的完整链路,支持QR码、Code 128、EAN-13等多种格式,适合需要在App中快速落地扫码功能的…

2026/9/2 7:14:14

用Claude Code搭建农业物联网监测平台:完整实战指南

Claude Code 的 100 个实战案例中,农业物联网监测平台是很有代表性的一种。它并不是让 AI 单纯生成几个页面,而是涉及传感器数据采集、协议解析、存储建模、接口服务、告警计算和可视化展示的完整链路。把这条链路交给 Claude Code 来辅助搭建&#xff0…

2026/9/2 7:14:14

超迷你DC-ATX电源:小机箱空间利用与供电改造完全指南

这次我们来看一个能直接改变小机箱内部布局的电源方案:超迷你 DC-ATX 电源。它的体积往往只有一张名片大小,甚至“手指大小”,却能输出上百瓦功率,把传统 ATX 电源挤出机箱之外。对于折腾 ITX、A4 结构、NAS、软路由、HTPC 的玩家…

2026/9/2 7:14:14

C语言医院挂号系统实战:链表与文件操作的综合应用

简介:本资源是一个基于C语言开发的轻量级医院挂号系统实现,面向C语言初学者与课程设计实践者,旨在通过真实业务场景帮助学习者掌握结构体设计、链表管理、文件持久化及模块化函数开发等核心编程能力。压缩包为ZIP格式,大小56KB&am…

2026/9/2 7:14:14

基于知识图谱与推荐系统的药物靶点预测:从数据到AI模型实战

简介:本资源是一套面向计算机及相关专业本科生的课程设计与期末大作业实战项目,聚焦于生物信息学交叉场景——利用知识图谱与推荐系统协同预测药物-靶点相互作用。项目代码完整、结构清晰,涵盖数据预处理(如hetionet.py、yamanish…

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/1 8:27:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/1 7:04:43

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/2 0:03:41

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/2 0:03:41

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

这次我们来看一个很实用的 DeepSeek 落地场景:用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务,标题写得很直白,但背后其实是一整套可以复用的技术流程:字幕解析、模型调用、批量…

2026/9/2 0:03:41

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

当你家里摆着一台天猫精灵,却总希望语音助手偶尔“不正经”一点,不用官方腔回答问题,而是张口就接几句搞笑段子,会是什么体验?我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱,而是直…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…