STL 之 vector 通俗理解

 注:如果只想学使用,直接看第二大点

一、创建

容器之一:vector

单词 vector  意思是“向量,矢量,载体……”  你可以读成 “微可脱尔”,哈哈哈

 其实就是个动态数组,通俗的讲就是个高级一点的数组而已,一般的普通数组一旦建立了后其大小就不可以再改变了,但是这个高级的数组vector就高级在建立了以后其大小依然还是可改变的,想多大就多大,大到内存爆炸,想多小就多小,小到为0,这就是它的牛掰之处了,所以它有一个超级厉害的特点:在它的尾巴处添加或者删除的时间复杂度为O(1),只需要记住在尾巴处插入或者删除很快就行,至于怎么个快法,你就当比走路快一点点就行了(涉及其他知识,学完其他容器就知道了)

一句话就是:vector 是数组的高级版,大小随“心”所欲,尾巴处增删比较方便。完事

 接下来看它的所有操作:

使用前记得先添加头文件:

#include <vector>

一、创建:

① vector< Type > name ;          就是:  vector <数据类型>  你想取的名字  ;

vector < int > myVector = { 1,2,3,4,5 }; //和数组一样的功能

③ 当变量用,直接用 “=” 给它赋值

	vector < int > aa = { 1,2,3 };int bb[5] = {1,2,3,4,5} vector < int > myVector = aa; //直接把一个高级数组 aa 当一个具体数值用vector < int > myVector = bb; //直接无视 bb 的大小,只要它是 int 类型就行

④当函数用,

//注意参数类型 和参数个数vector < int > myVector(n); //参数为一个正整数,创建一个大小为n的高级数组,默认为0vector < int > myVector(n,num); //参数为一个正整数和数值, 创建一个大小为n、默认为num的高级数组vector < int > myVector(testVector);  //创建一个完全等于testVector 的新高级数组vector < int > myVector (*p, *q);  // 理解为把 起始地址为 *p ,结束地址为 *q-1 的一段数据复制给新数组myVector

注意:!!!!!!!!!!!!!!!!!!!!!!!!!

vector < int > aa = { 1,2,3 };

vector < int > myVector = aa;   等于  vector < int > myVector( aa );

⑤二维动态数组,也就是 vector< Type > name 里的类型 Type  也为 vector 类型 ,即就是

vector <     vector < int >     > myVector(n, testVector);

…………

够用了

…………

二、使用

①访问:

可以使用下标操作符 [] 来访问,还可以使用  .at(index)来访问, 还可以使用迭代器 vector<int> :: iterator it  来访问

	vector<int> myVector = { 100,200,300,400 };cout << myVector[0] << endl; // 100 cout << myVector[1] << endl; // 200cout << myVector[2] << endl; // 300cout << myVector[3] << endl; // 400或者cout << myVector.at(0) << endl; // 100 cout << myVector.at(1) << endl; // 200cout << myVector.at(2) <<endl;  // 300cout << myVector.at(3) << endl; // 400
或者
vector<int> :: iterator it=aa.begin();cout << *it   << endl; // 100 cout << *it+1 << endl; // 200cout << *it+2 <<endl;  // 300cout << *it+3 << endl; // 400

②增删改查

增加: push_back() 和  insert()  和 emplace() ,后两个是属于迭代器的函数,STL里面的很多容器都可以使用,而且一般vector 只用于不涉及在中间进行插入或者删除操作的情况,因为时间复杂度比较高,不合适,有其他更合适的容器,所以说,虽然一般不这么用,但是我们要知道它是可以在中间增加、删除的,至于怎么用就不多说了

使用 push_back() 函数将元素添加到 vector 的末尾,默认且只能添加到末尾

	vector<int> myVector = { 1,2,3,4 };myVector.push_back(100);myVector.push_back(200);myVector.push_back(300);//输出内容是:1 2 3 4 100 200 300for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

删除:

同样有 pop_back()  和  erase()  和  remove() ,后两个同理,可以用,但不合适

使用 pop_back() 函数删除 vector 末尾的元素,默认且只能删除末尾的元素 。

	vector<int> myVector = { 100,200,300,400,500 };myVector.pop_back();myVector.pop_back();cout << myVector.size() << endl; // 3//输出内容是:100 200 300for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

修改:

使用下标操作符 [] 来修改、 使用 .at(index)来修改 、还可使用迭代器 *it = 来修改

	vector<int> myVector = { 100,200,300,400,500 };myVector[0] = 111; // 修改索引为0的元素myVector[1] = 222; // 修改索引为1的元素//输出内容是:111 222 300 400 500myVector.at(0) = 333; // 修改索引为0的元素myVector.at(1) = 444; // 修改索引为1的元素//输出内容是:333 444 300 400 500vector<int>::iterator it = myVector.begin();*it = 555; *(it+1) = 666; //输出内容是:555 666 300 400 500

查找:

使用 find() 函数来查找指定值的元素,或者使用迭代器来遍历查找。

①使用 find() 函数查找:

	vector<int> myVector = { 100,200,300,400,500,600 };vector<int>::iterator it = find(myVector.begin(), myVector.end(), 500);//输出内容为:目标元素的索引为: 4if (it != myVector.end()) {cout << "目标元素的索引为: " << distance(myVector.begin(), it) <<endl;}else {cout << "没有找到" <<endl;}

②使用迭代器遍历查找:

	vector<int> myVector = { 100,200,300,400,500,600 };bool found = false;int valueToFind = 300;//输出内容为:目标元素的索引为: 2for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {if (*it == valueToFind) {cout << "目标元素的索引为: " << distance(myVector.begin(), it) << endl;found = true;break;}}if (!found) {cout << "没有找到" << endl;}

清空 vector 中的元素:

使用clear() 函数可以清空 vector 中的所有元素。

	vector<int> myVector = { 100,200,300,400,500,600 };cout << myVector.size() << endl; // 6myVector.clear();cout << myVector.size() << endl; // 0

使用索引遍历 vector 中的元素:

使用for循环和索引来遍历 vector 中的元素。

	vector<int> myVector = { 100,200,300,400,500,600 };//输出内容是:100 200 300 400 500 600for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

使用迭代器遍历 vector:

通过迭代器遍历的方法

        vector<int> myVector = { 100,200,300,400,500,600 };//输出内容是:100 200 300 400 500 600for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); it++) {cout << *it << " ";}cout << endl;

使用foreach循环遍历 vector:

①第一种通过foreach循环遍历的方法

在这个例子中,使用的是范围-based for 循环(也称为foreach循环),其中 int it 是一个迭代变量,而不是传统的迭代器。这种循环方式是C++11引入的一种简化语法,用于遍历容器中的元素。

for (int it : myVector){},这里需要指定myVector中元素的类型,因为我定义的myVector元素类型是int,这里就使用int

	vector<int> myVector = { 100,200,300,400,500,600 };//输出内容是:100 200 300 400 500 600for (int it : myVector) {cout << it << " ";}cout << endl;

②第二种通过foreach循环遍历的方法(推荐)

这种遍历方式使用了C++11引入的范围-based for 循环,也称为foreach循环。在这种循环中,auto it 是一个自动类型推断的语法,it 并不是一个传统意义上的迭代器,而是直接取得 myVector 中的每个元素的值

for (auto it : myVector){},这里直接使用auto,不需要根据myVector中元素的类型改变

	 vector<int> myVector = { 100,200,300,400,500,600 };//输出内容是:100 200 300 400 500 600for (auto it : myVector) {cout << it << " ";}cout << endl;

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

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

相关文章

MR实战:分科汇总求月考平均分

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建学生实体类5、创建科目平均分映射器类…

jQuery-1.7.2存在任意文件读取漏洞

jQuery是一个快速、简洁的JavaScript框架,是一个丰富的JavaScript代码库&#xff0c;其1.7.2版本的sys_dia_data_down模块存在任意文件读取漏洞&#xff0c;攻击者可通过前台读取任意文件。 1.漏洞级别 高危 2.漏洞搜索 fofa body"webui/js/jquerylib/jquery-1.7.2.m…

git的常用命令以及在可视化工具中的使用方法

一.引言 想当初在刚进公司的时候&#xff0c;对于git的使用非常不熟悉&#xff0c;特别是分支的概念&#xff0c;导致开发效率变低&#xff0c;故通过此文章&#xff0c;总结git的使用经验 二.Git 常用命令详解 2.1 git clone [url]: 克隆远程仓库到本地 刚开始时&#xff0c…

MySQL按月分片

一、按照月分片 使用场景为按照自然月来分片,每个自然月为一个分片,但是一年有12个月,是不是要有12个数据节点才行呢?并不是。例如我现在只有三个分片数据库,这样就可以1月在第一个数据分片中,2月在第二个数据分片中,3月在第三个数据分片中,当来到4月的时候,就会重新开…

redis的搭建及应用(二)-redis的持久化策略

Redis的持久化策略 RDB RDB持久化是指在指定的时间间隔内将redis内存中的数据集快照写入磁盘&#xff0c;实现原理是redis服务在指定的时间间隔内先fork一个子进程&#xff0c;由子进程将数据集写入临时文件&#xff0c;写入成功后&#xff0c;再替换之前的文件&#xff0c;用二…

【Python】基于socket函数的TCP通信

基于socket函数的TCP通信 1 引言1.1 通信协议函数(客户端)1.2 通信协议函数(服务端) 2 传输文件&#xff08;以txt文件为例&#xff09;2.1 发送端&#xff08;客户端&#xff09;2.2 接受端&#xff08;服务端&#xff09; 3 传输图片&#xff08;基于OpenCV&#xff09;3.1 发…

istio 示例程序 bookinfo 快速部署

官网 文档位置 相关 yaml 资源下载 Bookinfo 应用分为四个单独的微服务&#xff1a; productpage&#xff1a;这个微服务会调用 details 和 reviews 两个微服务&#xff0c;用来生成页面details&#xff1a;这个微服务中包含了书籍的信息reviews&#xff1a;这个微服务中包含了…

开源元数据治理平台Datahub部署指南(小白版)

1.引言 datahub是做什么的&#xff0c;这里就不展开描述了&#xff0c; 如果想了解更多请自行阅读DataHub官网文档&#xff0c; 这里主要教大家如何一步一步安装然后100%部署完成。一般开源产品的文档都是被大家吐槽的最多的&#xff0c;部署步骤写的非常简单&#xff0c;重要…

编程语言的未来?

随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。那么&#xff0c;在技术不断进步的未来&#xff0c;编程语言的走向又将如何呢&#xff1f; 一、当前编程语言的发展趋势 1、向…

oracle与mysql的分析函数(窗口函数)

分析函数定义 在SQL语句中&#xff0c;很多查询语句需要进行GROUP BY分组汇总&#xff0c;但是一旦经过分组&#xff0c;SELECT返回的记录数就会减少。为了保留所有原始行记录&#xff0c;并且仍可以进行分组数据分析&#xff0c;分析函数应运而生。 Oracle 8i 版本开始支持窗…

代码随想录-刷题第三十九天

动态规划理论基础 动态规划的题目由重叠子问题构成&#xff0c;每一个状态一定是由上一个状态推导出来的。这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。 动态规划五步曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义…

Matlab:非线性规划

1、语法&#xff1a; xfmincon(fun,x0,A,b) xfmincon(fun,x0,A,b,Aeq,beq) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) xfmincon(problem) [x,fval]fmincon(___) [x,fval,exitflag,…

vue前端学习笔记

filter() 方法创建给定数组一部分的浅拷贝&#xff0c;其包含通过所提供函数实现的测试的所有元素。 const words [active, sunlight, self-confident, clever, health];const result words.filter((word) > word.length 6);console.log(result);结果如下&#xff1a; &…

Vue指令详解

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. `v-bind`2. `v-model`3. `v-if` / `v-else-if` / `v-else`4. `v-for`5. `v-on`6. `v-show`7. `v-pre`8. `v-cloak`⭐ 写在最后⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷

边缘检测——PidiNet网络训练自己数据集并优化推理测试(详细图文教程)

PiDiNet 是一种用于边缘检测的算法&#xff0c;它提出了一种简单、轻量级但有效的架构。PiDiNet 采用了新 颖的像素差卷积&#xff0c;将传统的边缘检测算子集成到现代 CNN 中流行的卷积运算中&#xff0c;以增强任务性能。 在 BSDS500、NYUD 和 Multicue 上进行了大量的实验…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPISDK中UserSet的技术背景代码案例分享第一步&#xff1a;保存相机当前参数设置UserSet_Save第二步&#xff1a;载入已经保…

go 语言程序设计第1章--入门

1.1 hello, world helloworld.go package mainimport "fmt"func main() {fmt.Println("Hello, World") }执行 go run helloworld.go 运行程序。 构建和执行. go build helloworld.go ./helloworld1.2 命令行参数 变量 os.Args 是一个字符串 slice. …

1527. 患某种疾病的患者

1527. 患某种疾病的患者 患者信息表&#xff1a; Patients --------------------- | Column Name | Type | --------------------- | patient_id | int | | patient_name | varchar | | conditions | varchar | --------------------- 在 SQL 中&#xff0c;patient_id &…

高并发系统常见问题及解决方案(Java)

在 Java Web 应用中,高并发环境会带来一系列的挑战,这些挑战可能会影响应用的性能、稳定性和可用性。下面是一些常见的问题以及相应的解决方案: 1. 线程资源竞争 问题: 当多个线程尝试同时访问同一资源时,可能会导致竞争条件,进而影响数据的完整性。 解决方案: 使用同步…

小米路由器2(R2D) 安装 MIXBOX

1. 先刷开发版 ROM http://www1.miwifi.com/miwifi_download.html 进入上述网页&#xff0c;找到 R2D 点击下载 开发版 ROM 教程 看 下载按钮上边的 “刷机教程” 刷机教程 2. 开启SSH工具 登录自己的小米账号后&#xff0c;里面会显示出 自己的 root密码&#xff1b; 默认…