【C++】vector基本用法介绍

news2024/11/28 10:38:26

vector简单介绍

    • 前言
    • vector原型
    • vector常用函数接口介绍
      • vector的构造、析构、赋值
        • 构造
        • 析构
        • =
      • 修改类的函数
        • push_back
        • insert
          • find 函数
        • erase
        • swap
      • 关于容量的函数
        • max_size
          • sort
      • vector\<char\> 和 string的区别
      • vector\<数据类型\>
    • 结束

在这里插入图片描述

前言

首先,vector的用法和string是非常相似的,前面已经将string的基本用法讲过了,所以这一篇不会讲那么多,就介绍一下vector的基本用法就可以了。
如果对于string不是很熟悉的话可以看一看我前面这篇:string介绍

还是和前面string一样,讲stl不是为了记住,而是为了让大家学会查文档。
还是那个cplusplus的网站:cplusplus

vector原型

vector就是顺序表,在stl库中用到了类模板,我们先来看一下vector的原型:
在这里插入图片描述
上面绿色的部分简单说一下:
在这里插入图片描述
上面的类模板第一个数据类型没有缺省值,这也就导致了我们平时如果要用vector的话就必须指定其内部存储的数据类型。也就是顺序表中存放的元素类型是什么。

上面的内存池模板参数是带缺省值的,也就是说我们自己可以实现一个内存池,但是这里没法讲,得到以后了再说。我们平时用的时候就直接用库中那个缺省值的内存池就够了。

vector常用函数接口介绍

vector的构造、析构、赋值

构造

长这样:
在这里插入图片描述
里面有些类型我们第一次见的话不认识,没关系,其实不认识的都是typedef的,不是什么新的类型。

文档中也是能查到的:
在这里插入图片描述

简单解释几个:

value_type:就将模板参数中的第一个T typedef 为value_type成为vector的成员类型,下面的同理。

allocator_type:就是模板参数中的第二个Alloc,也就是那个内存池。

reference:就是T&。引用。
加上const就是const T &

比如函数返回值中用到了reference
在这里插入图片描述
这个[]就是运算符重载,返回的就是n位置处的引用。

剩下的就不解释了,各位看一看就懂了,不懂的话百度一下。

然后就再继续说构造函数。
在这里插入图片描述
其实前面string学好了,这里看起来就很熟悉了。
不过第一个没见过,说一下,就是你可以在定义对象的时候就直接在<>里面传内存池,也可以在构造函数中传内存池。但不常用,就不细说了。

第二个就是开n个空间,并初始化为val。如果val没给值的话,缺省值为value_type(),这就是T(),也就是匿名对象。vector中的数据类型不仅能为int还可以为string、vector(int)等等。而int的匿名对象值为0。
在这里插入图片描述
第三个就是迭代器区间初始化。

第四个就是拷贝构造函数。

那么最常用的就是默认无参和拷贝构造,第二个有时候也用。第三个用的就非常少了。

然后上几个例子演示一下:
在这里插入图片描述

析构

这个就不讲了,自动调用的东西。

=

在这里插入图片描述
这个也没啥好讲的,模拟实现的时候跟构造函数一样要注意深浅拷贝问题就行。

修改类的函数

有尾插尾删,没有头插头删,但是可以用insert和erase来实现。

push_back

在这里插入图片描述

上面用到了[ ]操作符。

这里就顺便提一嘴vector遍历的三种方法:

  1. 下标 + [ ]
    就是上面演示的那种。

  2. 迭代器
    在这里插入图片描述
    vector迭代器的底层还是指针,和string一样。

  3. 范围for
    在这里插入图片描述
    前面讲string的时候也说了,范围for虽然看起来高大上一点,但是底层就是迭代器。这里也就不过多强调了。

提一嘴,库中的vector没有 << 和 >> 重载,不能直接cout或者cin。

那么pop_back就不演示了,很简单,直接说insert和erase。

insert

在这里插入图片描述
用insert和erase先要找到你要插入或删除的位置,这时候叫要用到find函数了。
库中string类提供了find函数,但是vector中并没有提供find,而是用算法库中的find函数,链表list也是。
vector、list等容器是没有提供成员函数find的,因为algorithm(算法)库中提供了一个find函数,可以在某一段迭代器区间内找一个元素,而不像string一样可能找的是一个字符,也可能找的是一个字串,子串的查找是多元素的查找,所以需要string自己提供find函数。

find 函数

库中的find长这样:
在这里插入图片描述
在迭代器区间[fist, last)中找val。
注意:在C++中,迭代器区间是左闭右开的[fist, last)。

库中find函数的实现是这样的:
在这里插入图片描述
注意到:
当能够找到val时,返回的是val位置的迭代器。
当找不到val时,返回的时last,也就是迭代器区间的末尾位置。

所以说我们在用完find函数并接受了其返回值之后,一定要判断一下返回值是否为end(),如果为end就返回失败了,也就是说没有找到,这时就不能乱用返回的位置了,可能会报错。

那么现在就用find来演示一下insert函数。
在这里插入图片描述
尤其注意判断一下。

但是这里不判断的话没事:
在这里插入图片描述

而且就算找不到某值,插入不判断也没事,因为会返回end(),end是最后一个有效元素的下一个位置:
在这里插入图片描述
但是这里已经出错了,因为这里的意图是在200前面插入10,但是根本没有200,所以就不插入了:
在这里插入图片描述
所以还是检查一下最好。

上面insert没有报错不代表都不会报错,下面就来说erase:

erase

长这样:
在这里插入图片描述
也是要用到迭代器。

直接给不带判断的例子:

能找到:
在这里插入图片描述

找不到:
在这里插入图片描述
上面报错报的是删除的迭代器位置超出范围。

所以说find后,要用pos加上判断。
在这里插入图片描述
这样就不报错了。

再说一下swap

swap

这个函数是vector库中自己提供的,而我们的算法库中也是有swap的,前面讲string的时候也提到过了。但是算法库中使用swap好多值拷贝,就导致了小号比较大,所以vector为了减少消耗,就提供了自己的swap函数,与库中的原理不同,这个会在模拟实现vector的时候再说。这里只是提一嘴。

关于容量的函数

在这里插入图片描述
可以说和string一模一样。

就说一下max_size。

max_size

这个函数返回的是 4G(42亿多字节) 除以 数据类型的大小。
int 为 4字节。
看例子:
在这里插入图片描述
除出来就是10亿多。

没什么用,留个印象就行。

剩下的就不说了,和string的一样,前面的博客也都说了。那个shrink_to_fit没说,但是也不常用,就不说了。

下面再说一个算法库中的函数sort

sort

这个函数挺有用的。
在这里插入图片描述
也是迭代器区间。

用的算法就是快排。

可以排升序,可以排降序。
默认情况下排升序。
看例子:
在这里插入图片描述

然后就是怎么显示排升序和降序。
但是讲之前要先细🔒一下第二个函数模板:
在这里插入图片描述
所以说,想要决定升序还是降序的话就要多传一个参数。

这个compare comp是仿函数,现在没法讲,等到讲stack和queue的时候再说。

多的这一个参数库中是有的,两个现成的仿函数,可以直接用。一个叫less,一个叫greater,二者都为类模板,在functional的头文件中。

直接上例子:
排升序用less:
在这里插入图片描述
排降序用greater:
在这里插入图片描述

但是一般也不这么用。
直接用匿名对象就行:

降序:
在这里插入图片描述

升序:
在这里插入图片描述

sort也可用来排string,就是按照ASCII来排。
就不演示了。

vector<char> 和 string的区别

最大的区别就是\0。
string后面是一定有一个\0的,而且有的操作是不一样的,像+=、find、比较大小、to_stirng、<<、>>等等。

所以vector<char>是无法替代string的。

vector<数据类型>

由于vector是类模板,其中的第一个模板参数T可以为很多类型。
可以为string,还可以为vector。

简单给个图解:
在这里插入图片描述

在这里插入图片描述

讲的话,没啥好讲的,来道例题:
杨辉三角

在这里插入图片描述

每行的首位元素为1,当前位置的数等于头顶两个数的和。

vector<vector<int>>就相当于是动态的二维数组。

vector<vector<int>> vv;

使用的时候就直接vv[i][j]就可以。
不用[]的话,应该长这个样子:(vv.operator[i]).operator[j]
就是第i行第j列的元素。

题解给出来:

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> res;
        res.resize(numRows);
        for(int i = 0; i < res.size(); ++i)
        {
            res[i].resize(i + 1);
            res[i].front() = 1;
            res[i].back() = 1;
        }

        for(int i = 1; i < res.size(); ++i)
        {
            for(int j = 1; j < res[i].size() - 1; ++j)
            {
                if(res[i][j] == 0)
                {
                    res[i][j] = res[i - 1][j] + res[i - 1][j - 1];
                }
            }
        }

        return res;
    }
};

结束

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

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

相关文章

vue watch

Vue.js已在全球开发人员中广受欢迎&#xff0c;这归功于其灵活的响应式系统和丰富的开发工具。本文将深入解析Vue中的Watch特性&#xff0c;我们将了解其功能&#xff0c;适用的实际例子&#xff0c;以及可能遇到的常见错误及其解决方案。 第一部分&#xff1a;Vue的Watch特性…

开放式耳机漏音有多大?开放式耳机和封闭式耳机哪个音质好?

什么是开放式耳机 从名字上理解就是开放样式的耳机&#xff0c;其实也确实如此&#xff0c;开放式耳机是不需要封闭耳道来传输声音&#xff0c;主要是通过耳骨振动传递或者声波震动耳膜&#xff0c;两者声音传递的方式都不用完全封闭耳道&#xff0c;可以让耳道对外界放开&…

【软件测试】如何梳理你测试的业务

目录 前言&#xff1a; 一、为什么要梳理业务&#xff1f; 二、梳理框架 1. 测试场景 2. 业务 3. 系统 4. 数据 5. 安全 6. 性能 7. 数据分析 8. 监控报警 9. 应急预案 前言&#xff1a; 在进行软件测试之前&#xff0c;合理和清晰地梳理测试的业务是非常重要的&a…

linux运维常用命令(持续更新)

目录 一&#xff1a; 查看指定端口是否被监听 二&#xff1a;查看某个端口/服务相关进程 三&#xff1a;在B机器查看是否可以访问A机器某个端口,查看端口是否开放 四&#xff1a;查看端口占用列表 五&#xff1a;查看端口占用情况 六&#xff1a;查看哪些进程监听了2181端…

了解PHP-入门-环境搭建-集成环境安装

PHP是一种创建动态交互性站点的强有力的服务器端脚本语言&#xff0c; PHP文件通常包含 HTML标签和一些 PHP脚本代码 Hypertext Preprocessor&#xff0c;超文本预处理器。是一种免费开源服务器端脚本语言&#xff0c;默认文件扩展名是 .php &#xff0c;可以嵌入到网页代码中&…

怎么学习PHP的文件上传和图像处理技术? - 易智编译EaseEditing

学习PHP的文件上传和图像处理技术可以按照以下步骤进行&#xff1a; 掌握基础知识&#xff1a; 了解PHP的基本语法和文件操作函数。熟悉文件上传的相关概念和流程。 学习文件上传&#xff1a; 学习如何在PHP中实现文件上传功能。了解表单的 enctype 属性、文件上传限制、文件…

防爆温湿度传感器:保障工业安全环境的关键设备

在现代工业生产过程中&#xff0c;安全是一项至关重要的考虑因素。特别是在危险和爆炸性环境中&#xff0c;保障人员和设备的安全更是至关重要。为了解决这一问题&#xff0c;防爆温湿度传感器应运而生。本文将详细介绍防爆温湿度传感器的工作原理、应用范围以及其在工业安全环…

伦敦银比起期货交易有哪些优势?

伦敦银交易属于现货交易&#xff0c;因此一般不受带交易时间、地点的限制&#xff0c;交易方式灵活方便&#xff0c;随机性强&#xff0c;投资者可以在任何场所与对手进行交易。相比之下&#xff0c;白银期货必须在交易所内依照法规进行公开、集中交易&#xff0c;不能进行场外…

Huawei Auth-Http Server 1.0 passwd文件泄露漏洞

先用fofa脚本爬取所有碧海威相关资产&#xff08;fofa脚本下载地址&#xff1a;&#xff09; python3 fofa-cwillchris.py -k body"umweb/u20.png" 将上面爬取到的文件&#xff08;一般是final****.txt&#xff09;移动到脚本目录下&#xff0c;保存为1.txt ./Huaw…

Redis实战——商户查询(一)

商户查询 缓存(Cache)&#xff1a;就是数据交换的缓冲区&#xff0c;俗称的缓存就是缓冲区内的数据&#xff0c;缓存数据在内存中&#xff0c;内存的读写性能完全高于磁盘&#xff0c;使用缓存可以大大降低用户访问并发量带来的服务器读写压力。当数据量较大时&#xff0c;如果…

rocketMq消息队列原生api使用以及rocketMq整合springboot

rocketMq消息队列 文章目录 rocketMq消息队列一、RocketMQ原生API使用1、测试环境搭建2、RocketMQ的编程模型3、RocketMQ的消息样例3.1 基本样例3.2 顺序消息3.3 广播消息3.4 延迟消息3.5 批量消息3.6 过滤消息3.7 事务消息3.8 ACL权限控制 二、SpringBoot整合RocketMQ1、快速实…

PLC工程师到C#上位机开发:成功转型的故事

从自动化PLC工程师转变为C#上位机开发工程师&#xff01;这是一个很大的转变&#xff0c;但是您的自动化背景将为您提供宝贵的经验和技能。刚好&#xff0c;我这里有上位机入门&#xff0c;学习线路图&#xff0c;各种项目&#xff0c;需要留个6。 在成功转变的过程中&#xf…

7.3.3 【Linux】磁盘格式化(创建文件系统)

XFS 文件系统 mkfs.xfs 我们常听到的“格式化”其实应该称为“创建文件系统 &#xff08;make filesystem&#xff09;”&#xff0c;使用的是mkfs&#xff0c;创建的是xfs文件系统&#xff0c;使用的是mkfs.xfs这个指令。这个指令这样用&#xff1a; 使用默认的xfs文件系统参…

速通协程,一步到位!

前言 协程的概念最核心的点就是一段程序能够被挂起&#xff0c;稍后在挂起的位置恢复&#xff0c;挂起和恢复是由使用者控制的。 数学模型 在一个线程的视角中&#xff0c;我们的程序是按照顺序来执行的&#xff0c;假设我们使用??????来描述一段程序的所有指令。那么…

elk中logstash的使用

1.前言 logstash是一个相对较重的日志收集器&#xff0c;可以通过多种方式获取到日志数据&#xff0c;如tcp、日志文件、kafka、redis、rabbitmq等方式&#xff0c;还可以使用filter去过滤日志、转换日志为json格式&#xff0c;所以logstash是一个功能强大的日志收集器&#x…

MFC项目添加外部头文件和源文件后编译出现C1010错误

出现这个问题的主要原因是如果使用VC向生成工程的话&#xff0c;默认使用预编译头文件“stdafx.h”&#xff0c;这样做的目的是为了加快编译速度。 如果加入第三方c/cpp文件没有#include “stdafx.h” &#xff0c;就会报此错误。 在<解决方案管理器中>(就是可以看到工程…

NLLloss,KLDivLoss,CrossEntropyLoss三类损失函数比对

前置知识 这三个函数在深度学习模型中十分常见&#xff0c;尤其是在知识蒸馏领域&#xff0c;经常会将这三个函数进行比较 1、Softmax函数 softmax函数通常作为多分类以及归一化函数使用&#xff0c;其公式如下&#xff1a; s o f t m a x ( x ) e x i ∑ i 1 e x i soft…

Drools概述和基本原理

目录 ​编辑 一、Drools是什么&#xff1f; 二、Drools使用场景 三、Drool架构内容 3.1 总体架构 3.2 构成内容说明 3.2.1 Rules 3.2.2 Production memory 3.2.3 Facts 3.2.4 Working memory 3.2.5 Pattern matcher 3.2.6 Agenda 四、为什么要用规则引擎&#xff1f; 4.1 声明…

el-descriptions的使用

el-descriptions的使用 解释&#xff1a; 我们页面有很多无序的列表展示&#xff0c;为了高效得去开发我们得页面&#xff0c;可以借助于这个组件进行适应。图片&#xff1a; 代码&#xff1a; template部分 <el-descriptions class"margin-top" :column"…

IP数据云揭示高风险IP的来源地

在全球网络安全日临近之际&#xff0c;IP数据云揭示高风险IP的来源地。这些高风险IP以其潜在威胁和犯罪活动而闻名&#xff0c;已引起了全球范围内的关注。 根据IP数据云介绍&#xff0c;高风险IP的主要来源地是位于亚洲和东欧的国家其中包括俄罗斯、朝鲜和乌克兰等地。这些地区…