C++初阶——vector

发布时间:2026/10/26 17:16:03

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/10/24 8:56:14

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

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

2026/10/26 7:24:40

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

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

2026/10/25 13:57:01

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

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

2026/10/26 17:14:47

2023年AI答辩工具选型与实战指南

1. 答辩AI工具现状与选型逻辑 2023年堪称AI工具爆发元年,各类智能写作助手如雨后春笋般涌现。在学术答辩场景中,AI工具已经从简单的语法检查进化到能自动生成讲稿框架、设计PPT逻辑流、甚至模拟评委提问的智能助手。面对市面上近百款相关产品&#xff0c…

2026/10/26 17:14:47

2026年网络安全行业趋势与转行指南

1. 为什么2026年网络安全行业值得关注2026年对网络安全从业者来说将是个关键年份。根据国际数据公司(IDC)的预测,到2026年全球网络安全市场规模将达到3450亿美元,年复合增长率保持在13%以上。这个数字背后反映的是各行各业对安全人…

2026/10/26 17:14:47

智能体开发:MCP核心机制与AgentSkill模块化设计

1. 智能体技术架构中的MCP核心机制剖析在智能体开发领域,MCP(Master Control Program)作为中枢神经系统般的存在,其设计优劣直接决定了智能体的响应速度和行为质量。我曾在三个大型AI项目中深度使用不同架构的MCP系统,…

2026/10/26 17:14:47

Codesys电子凸轮点修改实战:从数据结构到在线下装与避坑指南

简介:这份案例包面向工业自动化领域的运动控制开发者与PLC编程学习者,聚焦在Codesys环境下调整与优化凸轮曲线这一实际问题。内容围绕凸轮关键点修改展开,涵盖曲线编辑、运动规划、运行时动态改点、I/O配置与同步、调试观察及安全限速等知识点…

2026/10/26 17:14:47

RAG技术解析:语义表示、检索优化与知识融合实战

1. RAG技术全景解析:从语义表示到知识融合的完整架构 RAG(Retrieval-Augmented Generation)作为当前最前沿的AI技术范式之一,正在彻底改变知识密集型任务的实现方式。这套技术体系的核心在于将传统检索系统与大型语言模型的生成能…

2026/10/26 17:09:47

MSA存储认证题库解析:从开机顺序到RAID、多路径与协议

简介:这份文档面向备考 H3CNE-MSA(H3C 认证工程师-MSA 存储)的考生与 H3C 代理存储设备的技术服务人员,围绕 MSA 2040/2042 等产品的基础配置与维护知识组织题目,帮助读者在认证前系统检验对存储概念、协议与运维细节的…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/26 0:20:17

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/26 0:00:48

Nested Learning:解决AI灾难性遗忘的分层记忆架构

1. 为什么AI需要"记忆"能力?在传统深度学习模型中,我们常遇到一个根本性问题:模型在处理新任务时,往往会完全遗忘之前学到的知识。这种现象被业界称为"灾难性遗忘"(Catastrophic Forgetting)。想象一下&#…

2026/10/26 0:00:48

企业级大模型应用:OCR预处理、Dify编排与DeepSeek落地实战

1. 这不是“用大模型”,而是重构工作流的起点“大模型的应用和工具”——这八个字现在被贴在无数技术分享、招聘JD、内部立项书的标题栏里,但绝大多数人点进去后看到的,是零散的API调用示例、几个开源UI截图、或者一句“接入LLM就能降本增效”…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑