【C++第三阶段】vector容器

以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录

  • 构造函数
  • 赋值操作
  • 容量和大小
  • 插入和删除
  • 数据存取
  • 互换容器
  • 预留空间


构造函数

vector函数是常用数据结构,见于刷题网站。

它是单端数组,与普通数组区别在于可以动态扩展。

动态扩展是编译器自动的,不是在原空间之后续接新空间,而是找更大的内存空间,将原数据拷贝新空间,释放原空间。

image-20240409155224397

vector容器迭代器支持随机访问。

目前介绍四种vector的构造函数。

  • vector<T> v;
  • vector(v.begin() , v.end());
  • vector(n,elem);
  • vector(const vector &vec);

第①种创建一个普通的vetcor容器,容器元素为T,需要用其他方式对v赋值。

第②种将[v.begin(),end()]区间元素拷贝给本身。

第③种将n个elem个元素拷贝给本身。

第④种将其他vector容器拷贝给自身。

代码示例:

void printVector(vector<int> &v) {cout << "当前vector元素为:";for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {cout << *front <<" ";}cout << endl;
}void test0409() {vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);printVector(v);vector<int> vs(v.begin(), v.end());printVector(vs);vector<int> vss(3, 5);printVector(vss);vector<int> vsss(vs);printVector(vsss);
}

运行结果:

image-20240409162852827

赋值操作

给vector容器赋值。

目前介绍的函数有:

  • vector & operator=(const vector &vec);
  • assign(beg , end);
  • assign(n ,elem);

第①种方法,是用另一个vector容器直接赋值。

第②种方法,是调用vector.assign()函数,对其赋值。

第③种方法,是调用vector.assign()函数,给容器n个elem元素。

代码示例:

void printVector(vector<int> &v) {cout << "当前vector元素为:";for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {cout << *front <<" ";}cout << endl;
}
void test0409a() {vector<int> v;for (int i = 0; i < 5; i++) {v.push_back(1+i * i*i - i*i);}printVector(v);vector<int> v2 = v;printVector(v2);vector<int> v3;v3.assign(v2.begin(), v2.end());printVector(v3);vector<int> v4;v4.assign(3, 5);printVector(v4);
}

运行结果:

image-20240409164021172

容量和大小

vector容器的大小和容量相关操作

目的函数
判断容器是否为空empty();
容器的容量,真实的占用空间大小capacity();
容器的个数,常用size();
重新指定容器长度为num,若容器变长,则默认值填充新位置。
若容器变短,则末尾容器长度被删除。
resize(int num);
重新指定容器长度为num,若容器变长,则默认值填充新位置。
若容器变短,则末尾超出容器长度被删除。
resize(int num , elem);

代码示例:

void printVector(vector<int> &v) {cout << "当前vector元素为:";for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {cout << *front <<" ";}cout << endl;
}
void test0409b() {vector<int> v;cout << "容器是否为空?->" << v.empty() <<" . " << endl;for (int i = 0; i < 5; i++) {v.push_back(i + i * i * i - i * i);}printVector(v);cout << "容器是否为空?->" << v.empty() << " . " << endl;cout << "容器容量大小:" << v.capacity() << " . " << endl;cout << "容器个数:" << v.size() << " . " << endl;v.resize(2);printVector(v);cout << "容器容量大小:" << v.capacity() << " . " << endl;cout << "容器个数:" << v.size() << " . " << endl;v.resize(5, 5);printVector(v);cout << "容器容量大小:" << v.capacity() << " . " << endl;cout << "容器个数:" << v.size() << " . " << endl;}

运行结果:

image-20240409165029993

插入和删除

vector容器插入操作,删除操作

介绍有以下几个函数

插入:

目的函数
尾部插入元素elepush_back(ele);
迭代器指向位置pos插入元素eleinsert(const_iterator pos , ele);
迭代器指向位置pos插入n个元素eleinsert(const_iterator pos , int count , ele);

删除:

目的函数
删除最后一个元素pop_back();
删除迭代器指向的元素erase(const_iterator pos);
删除迭代器从start到end的元素erase(const_iterator start , const_iterator end);
删除容器中所有元素clear();

代码示例:

void printVector(vector<int> &v) {cout << "当前vector元素为:";for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {cout << *front <<" ";}cout << endl;
}
void test0409c() {vector<int> v;for (int i = 0; i < 5; i++) {v.push_back(-i + i * i * i + i * i);}cout << "最开始vector" << endl;printVector(v);cout << "尾部插入一个元素5" << endl;v.push_back(5);printVector(v);cout << "在2号位置插入一个元素7" << endl;vector<int>::iterator it = v.begin();//开始(it++);//第2个位置v.insert(it, 7);printVector(v);cout << "向倒数第二个位置插入3个元素6" << endl;vector<int>::iterator end = v.end();end--;v.insert(end, 3, 6);printVector(v);cout << "删除最后一个元素" << endl;v.pop_back();printVector(v);cout << "删除当前首个元素" << endl;v.erase(v.begin());printVector(v);cout << "全删除" << endl;v.erase(v.begin(),v.end());printVector(v);cout << "删除所有元素" << endl;//v.clear();cout << "当前数组是否为空?" << v.empty() << " . " << endl;}

注意,迭代器使用一次后会失效。

运行结果:

image-20240409172330805

数据存取

对vector中的数据进行存取操作。

目的函数
返回索引index所指的数据at(int index);
返回索引index所指的数据operator[];
返回容器中第一个数据元素front();
返回容器中最后一个数据元素back();

代码示例:

void printVector(vector<int> &v) {cout << "当前vector元素为:";for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {cout << *front <<" ";}cout << endl;cout <<"============================================" << endl;
}void test0409d() {vector<int> v;for (int i = 0; i < 5; i++) {v.push_back(-i + i * i * i + i * i);}cout << "最开始vector" << endl;printVector(v);cout << "取出索引为3的数据" << endl;cout << v.at(3) << endl;cout << "第二种方式取出索引为3的数据" << endl;cout << v[3] << endl;cout << "返回容器第一个元素" << endl;cout << v.front()<<endl;cout << "返回容器中最后一个数据" << endl; cout << v.back();
}

运行结果:

image-20240409172840227

互换容器

两个容器元素互换。——swap(vec);

代码示例:

void printVector(vector<int> &v) {cout << "当前vector元素为:";for (vector<int>::iterator front = v.begin(); front != v.end(); front++) {cout << *front <<" ";}cout << endl;cout <<"============================================" << endl;
}
void test0409e() {vector<int> v1;for (int i = 0; i < 5; i++) {v1.push_back((i + i * i * i)/3 + i * i);}printVector(v1);vector<int> v2;for (int i = 0; i < 4; i++) {v2.push_back((i - i * i * i) / 2 + i * i);}printVector(v2);v1.swap(v2);printVector(v1);printVector(v2);
}

运行结果:

image-20240409173225811

预留空间

目的:减少vector在动态扩展容量时的扩展次数。

函数:reserve(int len);

容器预留len个元素长度,预留位置不初始化,元素不可访问。

代码示例:

想要在容器中插入十万条数据,看共开辟多少次空间。

void test0409f() {int num = 0;vector<int> v;int* p=NULL;for (int i = 0; i < 10000000; i++) {v.push_back(i);//p = &v[0];if (p != &v[0]) {p = &v[0];num++;}}cout << "一共开辟了" << num <<"次空间" << endl;
}

运行结果:

image-20240409174014330

但是如果有预留空间,次数会大大减少。

在第5行插入v.reserve(1000000);

image-20240409174053494


以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

学吧,学无止境,太深了

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

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

相关文章

【Linux】基础IO----理解缓冲区

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解缓冲区 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Linux初阶 > 望…

Aritest+python+Jenkins解放双手iOS/Android自动化

ARITest、Python 和 Jenkins 可以结合在一起创建一个自动化测试解决方案&#xff0c;实现持续集成和持续测试的目标。以下是三者如何协同工作的基本概念&#xff1a; 1. **ARITest**&#xff1a; ARITest 是一款功能全面的自动化测试工具&#xff0c;提供 UI 自动化、接口自…

独立服务器,数据安全保障:WorkPlus即时通讯为企业信息安全把关

随着手机普及率的不断增加&#xff0c;即时通讯已经成为了企业内部沟通的重要方式。WorkPlus作为一家领先的企业级即时通讯服务商&#xff0c;提供了全方位的即时通讯解决方案&#xff0c;助力企业实现沟通无障碍、协作高效率的目标。 WorkPlus提供了多样化的即时通讯功能&…

轻松解锁销售利润!使用淘宝商品关键词搜索API接口

随着电商行业的快速发展&#xff0c;如何提高销售利润成为了卖家们的关注焦点。淘宝商品关键词搜索API接口提供了一种高效的方式来帮助卖家们找到最适合的商品关键词&#xff0c;提高商品曝光率和销售量。联讯数据将全面介绍淘宝商品关键词搜索API接口的用途、优势以及如何使用…

蓝桥杯模拟赛题——魔法失灵了——toRefs()

目标 找到 index.html 中 TODO 部分&#xff0c;正确修复代码使 data 对象恢复响应式特性&#xff0c;即点击页面上的 - 与 按钮可以改变 value 的值。正确实现后效果如下&#xff1a; 题解 value是reactive 利用toRefs; toRefs() 函数可以将 reactive() 创建出来的响应式对象…

数据结构之单链表的相关知识点及应用

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构 目录 链表的概念及结构 链表与顺序表的区别与优劣势 链表的分类 单链表的实现 单链表中增加节点 单链表中尾插数据 打印单链…

《零基础入行IT:步步为营的转型攻略与实践策略》

在信息化社会&#xff0c;IT行业以其强劲的发展势头、广阔的就业前景和丰厚的薪酬待遇&#xff0c;吸引了无数希望转行或初入职场人士的目光。然而&#xff0c;对于毫无相关背景知识的人来说&#xff0c;如何成功叩开IT行业的大门&#xff0c;似乎是一项颇具挑战性的任务。本文…

visual studio 2017开发QT框架程序

1. 配置开发环境 首先创建项目 进入到项目后&#xff0c;右键点击项目点击属性&#xff0c;配置如下&#xff1a;

Window11的CUDA 和CUDNN的安装

确定自己电脑的英伟达驱动版本 打开英伟达的控制面板:确定自己的版本,安装的CUDA和CUDNN不能超过这个版本 下载CUDA (我个人安装的是CUDA12)CUDA12的下载网址 下载网址 下载到安装包之后,直接点击就可以完成安装: 完成之后会有个文件夹:

linux上使用redis-cli登录以及操作redis

1、找到redis-cli 2、输入redis-cli回车 3、登录redis 输入auth密码 4、登录成功

stm32 之SPI通信协议

本文为大家介绍 SPI 通信协议的基础知识。 文章目录 前言一、SPI协议的概念二、SPI总线架构三、SPI通讯时序1. 起始&#xff0c;停止 信号2.CPOL&#xff08;时钟极性&#xff09;/CPHA&#xff08;时钟相位&#xff09; 四&#xff0c; I2C 总线 和SPI 总线比较相同点&#xf…

Elastic 线下 Meetup 将于 2024 年 4 月 27 号在重庆举办

2024 Elastic Meetup 重庆站活动&#xff0c;由 Elastic、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 活动时间 2024年4月27日 13:30-18:00 活动地点 中国重庆 沙坪坝区学城大道62-1号研发楼一期b3栋1楼(瑞幸咖啡旁&#xff09; 活动流程 14:00-14:50…

卫星图像10个开源数据集资源汇总

文章目录 1、UC Merced Land-Use 2、Indian Pines 3、KSC 4、Washington DC 5、BigEarthNet 6、水体卫星图像的图像 7、城市航拍图像分割数据集 8、游泳池和汽车卫星图像检测 9、人工月球景观数据集 10、马萨诸塞州道路数据集 1、UC Merced Land-Use 数据集下载地址&am…

Windows系统本地部署Jupyter Notebook并实现公网访问编辑笔记

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…

鱼眼摄像头畸变校正方法概述

1. 摘要 鱼眼摄像头以其独特的广阔视场和其他特点&#xff0c;在各个领域得到了广泛应用。然而&#xff0c;与针孔相机相比&#xff0c;鱼眼摄像头存在显著的畸变&#xff0c;导致拍摄的图像失畸变严重。鱼眼摄像头畸变是数字图像处理中常见的问题&#xff0c;需要有效的校正技…

淘宝/天猫获得淘宝商品评论 API 返回值说明,item_review-获得淘宝商品评论

淘宝/天猫的API通常不对公众开放&#xff0c;特别是涉及到具体商品评论的API。商家或开发者需要使用淘宝/天猫开放平台提供的API进行开发&#xff0c;并且需要遵循一定的申请流程和权限限制。 对于“item_review-获得淘宝商品评论”的API返回值说明&#xff0c;我无法提供具体…

CSS3 立体 3D 变换

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍CSS3 立体 3D 变换&#x1f48e;1 坐标轴&#x1f48e;2 perspective 透视视…

mybatis-puls-配置日志

#日志配置 mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl 我们所有的sql现在是不可见的&#xff0c;我们希望知道它是怎么执行的&#xff0c;所以我们必须要看日志

远程连接工具NoMachine的使用

一、软件介绍 NoMachine是一款远程桌面软件。适用于Linux、windows、ARM、Android等几乎全系统。常见的远程桌面软件还有向日葵、ToDesk等。选择NoMachine是因为它支持ARM32位、ARM64位处理器。 ZeroTier是一款内网穿透软件&#xff0c;通过建立虚拟局域网&#xff0c;能够实现…

校园通用型发生网络安全事件解决方案

已知校园多教学楼、多教学机房、非标网络机房缺乏防护设备、检测设备、安全保护软件(杀软) 切断所有外网&#xff0c;断网处理!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 部署路由系统可选择爱快、routeros、openwrt。等。可将日志上传到日志分析系统。《这项非必要的》 部署开源防火…