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

news2026/5/3 20:21:24
文章参考黑马程序员匠心之作|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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2539886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…