当前位置: 首页 > article >正文

Java 转 C++ 系列:STL容器之vector

文章参考黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难STL中的vector容器的一点总结文章目录一、vector容器简介二、vector和数组的主要区别三、 vecotr容器中的使用3.1 构造函数3.2 vector赋值操作3.3 vector容量和大小3.4 vector插入和删除3.5 vector数据存取3.6 vector互换容器3.7 vector预留空间四、扩展4.1 迭代器输出4.2 存放自定义数据类型4.3 容器嵌套容器一、vector容器简介vector数据结构和数组非常相似也称为单端数组。vector又被称为向量vector可以形象的描述为长度可以动态改变的数组功能和数组较为相似。实际上更专业的描述为vector是一个多功能的能够操作多种数据结构和算法的模板类和函数库vector之所以被认为是一个容器是因为它能够像容器一样存放各种类型的对象。简单地说vector是一个能够存放任意类型的动态数组能够增加和压缩数据。注STL的容器从实现的角度讲可以说是类模板class teplate)二、vector和数组的主要区别数组分配的是静态空间一般分配了就不可以改变就像我们熟知的定义了一个数组那么数组的长度就不可以改变了我们也不可以进行越界访问但是编译器不检查越界这一点在我们编程的时候要尤为注意很多都可能会烦这样的错误。一般申请的数组长度不能满足我们的要求了我们要重新申请大一点数组然后把原数组中数据复制过来。vector分配的是动态空间即我们声明vector容器的时候可以不指定容器的大小vector是随着元素的加入空间自动扩展的。但是我们必须要负责任的肯定vector分配的空间是连续的也就是支持数组中的下标随机访问。vector的实现机制是预留一部分空间而且预留空间的大小是按一定比率增长的如果空间不够用的话要保证连续就必须重新new一片空间然后将原有元素移动到新空间同时预留新的空间最后将原来的那部分空间释放掉。这样预留空间的好处就是不用每次向vector中加元素都重新分配空间。另外使用 vector 要求添加头文件#includevector三、 vecotr容器中的使用3.1 构造函数vector容器的构造函数声明方式主要有以下几种vectorElemv;// 创建空vector默认构造函数vectorElemv1(v);// 拷贝构造函数用另一个vector初始化vectorElemv(n);// 含n个元素元素进行值初始化int默认0vectorElemv(n,elem);// 含n个elem元素的拷贝vectorElemv(beg,end);// 用[beg, end)左闭右开区间初始化示例代码//第一种方式vectorintv1;// 1 2 3//v1 { 1,2,3 };v1.push_back(1);v1.push_back(2);v1.push_back(3);//第二种方式vectorintv2(v1);// 1 2 3//第三种方式vectorintv3(5);// 0 0 0 0 0int 默认 0//第四种方式vectorintv4(5,4);// 4 4 4 4 4 5个4//第五种方式迭代器方式vectorintv5(v1.begin(),v1.end());// 1 2 3//第五种种方式指针方式inta[]{1,2,3,4,5,6};vectorintv6(a,a6);// 1 2 3 4 5 6注vector Elem v(beg,end)声明方式创建一个和[beg,end)区间元素相同的 vector一定要注意是左闭右开。包括v.end()函数也是返回的vector末端的下位置相当于int a[n]的a[n]并不能访问。另外值得注意的是以下两种方法是两种初始化方法vectorintv1;// 无参构造v1{1,2,3};// 赋值操作 → 调用重载的 vectorintv2{1,2,3};// 初始化列表构造vectorintv3{1,2,3};// 等价写法纯初始化3.2 vector赋值操作vectoroperator(constvectorvec);,重载等号操作符assign(beg,end);,将[beg,end)区间中的数据拷贝赋值给本身assign(n,elem);,将n个elem拷贝赋值给本身示例代码vectorintv1;//无参构造v1{1,2,3};vectorintv2v1;// 重载等号操作符vectorintv3;v3.assign(v1.begin(),v1.end());// 1 2 3vectorintv4;v4.assign(3,99);//3个99// 99 99 99v4.assign(2,100);// 完全覆盖// 100 100注assign函数会做 覆盖3.3 vector容量和大小empty();,判断容器是否为空capacity();,容器的容量size();,返回容器中元素的个数resize(intnum);,重新指定容器的长度为num若容器变长则以默认值填充新位置若容器变短则末尾超出长度的元素被删除resize(intnum,elem);,重新指定容器的长度为num若容器变长则以elem值填充新位置若容器变短则末尾超出长度的元素被删除示例代码vectorintv1{1,2,3};if(v1.empty()){coutv1为空endl;}else{coutv1不为空endl;coutv1的容量 v1.capacity()endl;// 3coutv1的大小 v1.size()endl;// 3}//resize 重新指定大小 若指定的更大默认用0填充新位置可以利用重载版本替换默认填充v1.resize(6,8);// 1 2 3 8 8 8//resize 重新指定大小 若指定的更小超出部分元素被删除v1.resize(5);// 1 2 3 8 83.4 vector插入和删除push_back(ele);,尾部插入元素elepop_back();,删除最后一个元素insert(const_iterator pos,ele);,迭代器指向位置pos插入元素eleinsert(const_iterator pos,intcount,ele);,迭代器指向位置pos插入count个元素eleerase(const_iterator pos);,删除迭代器指向的元素erase(const_iterator start,const_iterator end);,删除迭代器从start到end之间的元素clear();,删除容器中所有元素示例代码vectorintv1;//尾插v1.push_back(10);v1.push_back(20);v1.push_back(30);// 10 20 30//尾删v1.pop_back();// 10 20//插入v1.insert(v1.begin(),100);// 100 10 20v1.insert(v1.begin(),2,1000);// 头部插入两个1000// 1000 1000 100 10 20//删除v1.erase(v1.begin());// 1000 100 10 20//清空v1.erase(v1.begin(),v1.end());v1.clear();3.5 vector数据存取at(intidx);,返回索引idx所指的数据operator[];,返回索引idx所指的数据front();,返回容器中第一个数据元素back();,返回容器中最后一个数据元素示例代码vectorintv1{200,100,10,20};for(inti0;iv1.size();i){coutv1[i] ;}coutendl;for(inti0;iv1.size();i){coutv1.at(i) ;}coutendl;coutv1的第一个元素为 v1.front()endl;// 200coutv1的最后一个元素为 v1.back()endl;// 203.6 vector互换容器swap(vec);,将vec与本身的元素互换示例代码vectorintv1{1,2,3,4};vectorintv2{5,6,7,8};v1.swap(v2);printVector(v1);printVector(v2);// v1: 5 6 7 8// v2: 1 2 3 43.7 vector预留空间动态扩展vectorintv;// 空容器没存数据cout空容器sizev.size() capacityv.capacity()endl;// 0 0// 添加4个元素v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);cout存4个数sizev.size() capacityv.capacity()endl;// 4 4// 继续添加第5个元素v.push_back(5);cout存5个数sizev.size() capacityv.capacity()endl;// 5 6但是如果数据量较大在添加元素时会多次扩展因此可以一开始预留空间reserve(int len); //容器预留len个元素长度预留位置不初始化元素不可访问。示例代码统计 vector 在连续插入 10 万个元素的过程中内存扩容的次数//预留能存储10000个元素的内存空间v.reserve(100000);intnum0;// 统计开辟次数int*pNULL;for(inti0;i100000;i){v.push_back(i);if(p!v[0]){// 若指针不等于首地址即扩展时P失效pv[0];num;}}coutnum:numendl;// 1注因为预留了足够多的内存空间因此不会发生扩展四、扩展4.1 迭代器输出每一个容器都有自己的迭代器迭代器是用来遍历容器中的元素v.begin()返回迭代器这个迭代器指向容器中第一个数据v.end()返回迭代器这个迭代器指向容器元素的最后一个元素的下一个位置vectorint::iterator拿到 vector 这种容器的迭代器类型用于声明迭代器变量ite以遍历或操作容器可以把它当成指针用。遍历示例如下#includeiostream#includestring#includevector#includealgorithmusingnamespacestd;voidMyPrint(intval){coutvalendl;}// 函数传递方式voidprintVector(constvectorintv){// 因为形参添加const所以迭代器添加const_iteratorfor(vectorint::const_iterator itv.begin();it!v.end();it){cout*it ;}coutendl;}// C11 简化写法不用管迭代器类型voidprintVector2(constvectorintv){// 通用极简写法const 容器必用for(constautoval:v){coutval ;}coutendl;}intmain(){system(chcp 65001 nul);//创建vector容器对象并且通过模板参数指定容器中存放的数据的类型vectorintv;//向容器中放数据v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);vectorint::iterator pBeginv.begin();vectorint::iterator pEndv.end();//第一种遍历方式while(pBegin!pEnd){cout*pBeginendl;pBegin;}//第二种遍历方式for(vectorint::iterator itv.begin();it!v.end();it){cout*itendl;}//第三种遍历方式//使用STL提供标准遍历算法 头文件 algorithmfor_each(v.begin(),v.end(),MyPrint);//第四种遍历方式for(intx:v){coutxendl;}system(pause);return0;}4.2 存放自定义数据类型#includeiostream#includevector#includestringusingnamespacestd;//自定义数据类型classPerson{public:Person(string name,intage):m_Name(name),m_Age(age){}public:string m_Name;intm_Age;};//存放对象voidtest01(){vectorPersonv;//创建数据Personp1(aaa,10);Personp2(bbb,20);Personp3(ccc,30);v.push_back(p1);v.push_back(p2);v.push_back(p3);for(vectorPerson::iterator itv.begin();it!v.end();it){coutName:(*it).m_Name Age:(*it).m_Ageendl;}}//放对象指针voidtest02(){vectorPerson*v;//创建数据Personp1(aaa,10);Personp2(bbb,20);Personp3(ccc,30);v.push_back(p1);v.push_back(p2);v.push_back(p3);for(vectorPerson*::iterator itv.begin();it!v.end();it){Person*p(*it);coutName:p-m_Name Age:p-m_Ageendl;}}intmain(){test01();test02();system(pause);return0;}4.3 容器嵌套容器vectorvectorintv{{1,2,3},{4,5,6}};for(vectorvectorint::iterator itv.begin();it!v.end();it){for(vectorint::iterator vit(*it).begin();vit!(*it).end();vit){cout*vit ;}coutendl;}

相关文章:

Java 转 C++ 系列:STL容器之vector

文章参考: 黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 STL中的vector容器的一点总结 文章目录一、vector容器简介二、vector和数组的主要区别三、 vecotr容器中的使用3.1 构造函数3.2 vector赋值操作3.3 vector容量和大小3.4 vector插入和删除3.5 vect…...

别急着渲染!用Assimp命令行模式快速预览3D模型数据,排查导入问题

3D模型调试新思路:用Assimp命令行工具快速定位数据问题 在3D开发流程中,模型导入环节往往隐藏着各种"暗坑"——材质丢失、骨骼错位、动画异常等问题常常要到渲染阶段才会暴露。传统调试方式需要反复修改代码、重新编译、查看渲染结果&#xff…...

开源智能助手深度解析:基于LCU API的英雄联盟工具集实战指南

开源智能助手深度解析:基于LCU API的英雄联盟工具集实战指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的游戏生态…...

保姆级教程:手把手教你用dSPACE ModelDesk搭建第一个仿真道路(Road模块详解)

从零到一:dSPACE ModelDesk道路仿真模块实战指南 刚接触dSPACE ModelDesk的工程师常会遇到这样的困境:软件界面复杂、功能模块繁多,而官方文档又过于技术化。本文将彻底改变这种体验,通过一条包含弯道、坡度和多车道线的测试道路案…...

从ARM工程师视角看ZYNQ:我的第一个AX7020项目如何打通PS与PL?

从ARM工程师视角看ZYNQ:我的第一个AX7020项目如何打通PS与PL? 作为一名长期深耕ARM架构的嵌入式开发者,当我第一次拿到AX7020开发板时,那种既熟悉又陌生的感觉至今记忆犹新。熟悉的Cortex-A9处理器核与陌生的FPGA可编程逻辑单元共…...

3步轻松激活:KMS_VL_ALL_AIO智能脚本解决Windows与Office激活难题

3步轻松激活:KMS_VL_ALL_AIO智能脚本解决Windows与Office激活难题 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 开篇痛点直击:当系统提示"需要激活"时 你是…...

Proteus仿真+实物调试:手把手教你搞定STC单片机数码管动态显示的‘鬼影’与亮度不均

STC单片机数码管动态显示实战:从仿真到实物的‘鬼影’消除指南 数码管动态显示是嵌入式开发中的经典课题,但许多开发者在Proteus仿真完美运行后,烧录到STC89C51RC等实物单片机时却遭遇了"鬼影"、亮度不均等棘手问题。本文将带你深入…...

别再为Linux乱码发愁了!手把手教你从Windows‘偷’字体(附CentOS/Ubuntu双系统命令)

从Windows到Linux的字体迁移实战:彻底解决中文显示问题 每次打开Linux终端或图形界面,看到那些破碎的方块字符,是不是有种想砸键盘的冲动?别急,你电脑里其实藏着一套完美的解决方案——Windows系统自带的高质量中文字体…...

手把手教你用VMware Workstation搭建FusionCompute 6.5.1实验环境(附网络避坑指南)

VMware Workstation实战:从零构建FusionCompute 6.5.1实验环境全攻略 在虚拟化技术的学习道路上,能够亲手搭建一套完整的实验环境往往比阅读十篇理论文章更有价值。今天我们将深入探讨如何在个人电脑上,通过VMware Workstation构建华为Fusion…...

八大网盘直链解析工具:告别下载限速的完整解决方案

八大网盘直链解析工具:告别下载限速的完整解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

【紫光同创国产FPGA实战】——PDS开发环境一站式部署与避坑指南

1. 紫光同创PDS开发环境全景解读 第一次接触紫光同创FPGA开发套件时,我和大多数初学者一样,被各种专业术语和复杂的安装步骤搞得晕头转向。经过多个项目的实战积累,我发现其实只要掌握几个关键环节,就能轻松搭建起完整的开发环境。…...

每日极客日报 · 2026年04月21日

每日极客日报 2026年04月21日 今日精选 20 条 IT 科技热点,覆盖 AI、开源、云原生、硬件等领域。 🔥 今日头条 宁德时代举办2026"超级科技日",发布钠电、凝聚态、快充等技术 4月21日,宁德时代举办主题为"极域之…...

别再死磕COE文件了!Vivado里用$readmemb/h给RAM上电初始化的正确姿势(附避坑指南)

Vivado中RAM初始化的终极方案:告别COE文件,掌握$readmemb/h的正确用法 在FPGA开发中,RAM初始化是个看似简单却暗藏玄机的环节。许多开发者都曾陷入这样的困境:按照官方文档和主流教程使用COE文件初始化IP核,结果上电后…...

EF Core 10向量搜索扩展选型指南:5大主流方案实测对比——谁真正支持ANN+GPU加速?

第一章:EF Core 10向量搜索扩展选型背景与评测目标 随着大模型应用和语义检索场景的普及,将向量相似性搜索能力无缝集成至 EF Core 数据访问层已成为 .NET 开发者的核心诉求。EF Core 10 本身未内置向量类型支持或 ANN(近似最近邻&#xff09…...

Android Profiler 内存分析实战:从卡顿溯源到泄漏定位

1. Android Profiler内存分析器入门指南 第一次打开Android Studio的Profiler面板时,很多开发者都会被那些跳动的曲线和复杂的数据搞得一头雾水。记得我刚接触内存分析时,盯着那些上上下下的折线图看了半天,完全不知道从何下手。其实Android …...

7步快速掌握开源火箭设计:OpenRocket免费火箭建模软件终极指南

7步快速掌握开源火箭设计:OpenRocket免费火箭建模软件终极指南 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 你是否梦想设计一枚属于自己的火…...

Mac M1芯片用户看过来:保姆级教程,用VMware Fusion搞定CentOS 8虚拟机(含网络配置与SSH连接)

Mac M1芯片用户实战指南:VMware Fusion运行CentOS 8虚拟机的完整解决方案 当Apple Silicon的M1芯片重新定义移动计算性能时,开发者和运维人员却面临ARM架构带来的新挑战。特别是在需要搭建Linux开发环境时,传统x86架构的解决方案已不再适用。…...

从‘围成面积’到图像处理:用C++实现连通域分析与面积计算(信息学奥赛题拓展)

从网格到像素:C连通域分析在图像处理中的实战演进 第一次接触连通域问题时,我盯着那个10x10的网格看了整整半小时——那些简单的0和1背后隐藏着怎样的数学之美?后来才发现,这不仅是信息学奥赛的一道题目,更是计算机视觉…...

如何用DDrawCompat让Windows 10/11完美运行经典老游戏:终极兼容性修复指南

如何用DDrawCompat让Windows 10/11完美运行经典老游戏:终极兼容性修复指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/g…...

Real-ESRGAN-GUI:如何用免费AI工具一键修复模糊图片和低分辨率动漫

Real-ESRGAN-GUI:如何用免费AI工具一键修复模糊图片和低分辨率动漫 【免费下载链接】Real-ESRGAN-GUI Lovely Real-ESRGAN / Real-CUGAN GUI Wrapper 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN-GUI Real-ESRGAN-GUI是一款基于Flutter开发的跨…...

如何高效使用AI图像增强工具:ComfyUI Impact Pack完整操作指南

如何高效使用AI图像增强工具:ComfyUI Impact Pack完整操作指南 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址: …...

天龙八部单机版GM工具:5分钟上手,告别复杂数据库操作

天龙八部单机版GM工具:5分钟上手,告别复杂数据库操作 【免费下载链接】TlbbGmTool 某网络游戏的单机版本GM工具 项目地址: https://gitcode.com/gh_mirrors/tl/TlbbGmTool 你是否曾为修改《天龙八部》单机版游戏数据而烦恼?是否面对复…...

ICPC杭州站F题详解:如何用C++ STL的map和字符串查找模拟群聊转发?

ICPC杭州站F题实战解析:STL容器与字符串处理的竞赛级应用 在算法竞赛中,字符串处理与STL容器的灵活运用往往是解题的关键。ICPC杭州站的F题"Da Mi Lao Shi Ai Kan De"正是这样一个典型案例,它考察了选手对std::map的去重机制和字符…...

LinkSwift:8大网盘直链解析工具的技术实现与用户体验革命

LinkSwift:8大网盘直链解析工具的技术实现与用户体验革命 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

3分钟掌握跨平台资源下载神器:res-downloader完全使用指南

3分钟掌握跨平台资源下载神器:res-downloader完全使用指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数字…...

HMM加速架构设计:从VLSI实现到性能优化

1. HMM识别系统的VLSI架构设计背景隐马尔可夫模型(HMM)作为时序数据建模的强大工具,在语音识别、手势识别等领域发挥着关键作用。在实际应用中,HMM的输出概率计算(OPC)和似然得分计算(LSC)往往占据了系统90%以上的计算资源,这使得硬件加速成为…...

3分钟快速指南:如何用extract-video-ppt从视频中智能提取PPT演示文稿

3分钟快速指南:如何用extract-video-ppt从视频中智能提取PPT演示文稿 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 你是否曾经遇到过这样的情况:观看了一个…...

避坑指南:ROSALIND刷题时文件读取、版本差异那些事儿(Python生信)

ROSALIND刷题实战避坑手册:Python生信中的文件处理与版本陷阱 当你第一次打开ROSALIND平台,满心欢喜地下载了那道看似简单的DNA计数题目时,可能不会想到接下来会遭遇什么——文件编码错误导致读取失败、Python版本差异引发的字符串处理陷阱、…...

别再死记硬背了!用这5个生活化例子,轻松搞定对数公式(附Markdown速查表)

别再死记硬背了!用这5个生活化例子,轻松搞定对数公式(附Markdown速查表) 数学公式之所以让人望而生畏,往往不是因为它们本身有多复杂,而是缺乏与现实世界的连接。对数运算尤其如此——当它从抽象的符号变成…...

全球首发:基于.NET 11 Source Generators的AI模型编译器插件(支持自定义算子注入),已通过ML.NET 3.1.0兼容性认证

第一章:C# .NET 11 AI 模型推理加速 插件下载与安装插件官方发布渠道 .NET 11 AI 推理加速插件(Microsoft.AI.Inference.Accelerator)由 Microsoft 官方维护,仅支持 .NET 11 SDK 及以上版本。推荐通过 NuGet.org 获取最新稳定版&a…...