vector类(顺序表)

2023-09-20 17:45:57

1.定义:

在这里插入图片描述
这里顺序表的定义需要示例化:
vector<A类型>名字
这样就定义了一个A类型的顺序表

接口

在这里插入图片描述
使用vector容器需要包含头文件(#include)

成员函数

构造成员函数

【constructor】构造函数声明
在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;
 
void test() {
	vector<int> s1;//无参构造
	vector<int> s2(5, 1);//构造并初始化5个1
	vector<int> s3(s2);//拷贝构造
	vector<int> s4(s2.begin(), s2.end());//迭代器构造(拷贝s2)
}
 
int main() {
	test();
	return 0;
}

在这里插入图片描述

vector构造时的空间大小取决于使用的构造方法。以下是几种常见的构造方法和它们的空间大小:
默认构造方法:使用无参构造函数创建的vector对象将具有默认的初始容量。这个初始容量可以根据实现而有所不同,但通常情况下是0或者一个小的默认值。
区间构造方法:通过指定一个区间来构造vector对象,例如使用两个迭代器指定的开始和结束位置。这种情况下,vector对象的空间大小将根据给定的区间大小来确定。
元素个数构造方法:通过指定一个元素的个数来构造vector对象。在这种情况下,vector对象的空间大小将与指定的元素个数相等。
拷贝构造方法:通过拷贝一个已有的vector对象来构造新的vector对象。在这种情况下,新的vector对象的空间大小将与原始vector对象的空间大小相同。
请注意,vector对象的实际内存使用可能会随着元素的添加和删除而动态变化。当vector的大小超过当前容量时,vector会自动分配更大的内存空间来容纳新的元

析构函数

在这里插入图片描述

赋值

在这里插入图片描述

2.迭代器

2.1begin()和end()重点

获取第一个数据位置的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iterator

2.1.1应用
2.1.1.1函数调用

在这里插入图片描述

2.1.1.2用变量接受迭代器

变量的定义:
vector::iterator it=v4.begin();
顺序表类型::迭代器类型 变量
在这里插入图片描述
优质写法:使用auto
应用:
auto it =v4.begin();

2.2rbegin()和rend()

获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

在这里插入图片描述

2.2.1应用

函数调用
在这里插入图片描述
用变量接受迭代器
同上;

3.顺序表的访问(增删查检)

3.1operator[]和at

区别是:【】使用assert来报访问是否越界的问题
at使用抛异常来执行;
抛异常
例子:
在这里插入图片描述
【】的例子
在这里插入图片描述
at的例子
在这里插入图片描述

3.2 front()

std::vector::front
reference front();
const_reference front() const;

返回值:第一个元素的引用
使用示例
在这里插入图片描述
很少用;

3.3 back()

std::vector::back
reference back();
const_reference back() const;

返回值:返回最后一个元素的引用;
使用示例
在这里插入图片描述

4.vector空间增长问题

4.1 size()和capacity()

4.1.1应用

size的应用
在这里插入图片描述
capacity的应用
在这里插入图片描述

vector的扩容机制

// 测试vector的默认扩容机制
void TestVectorExpand()
{
 size_t sz;
 vector<int> v;
 sz = v.capacity();
 cout << "making v grow:\n";
 for (int i = 0; i < 100; ++i) 
 {
 v.push_back(i);
 if (sz != v.capacity()) 
 {
 sz = v.capacity();
 cout << "capacity changed: " << sz << '\n';
 }
 }
}
vs:运行结果:vs下使用的STL基本是按照1.5倍方式扩容
making foo grow:
capacity changed: 1
capacity changed: 2
capacity changed: 3
capacity changed: 4
capacity changed: 6
capacity changed: 9
capacity changed: 13
capacity changed: 19
capacity changed: 28
capacity changed: 42
capacity changed: 63
capacity changed: 94
capacity changed: 141
g++运行结果:linux下使用的STL基本是按照2倍方式扩容
making foo grow:
capacity changed: 1
capacity changed: 2
capacity changed: 4
capacity changed: 8
capacity changed: 16
capacity changed: 32
capacity changed: 64
capacity changed: 128

4.2 maxsize

容器可以开的最大空间。

4.3 resize()和reserve

在这里插入图片描述
注意(易错)
reserve后使用[]q
在这里插入图片描述

4.5shrink_to_fit(缩容)

将容量(capacity)减少到size大小;
尽量少用
原因:异地缩容;在另一个空间建顺序表;

5.修饰符

5.1push_back(尾插)

5.1.1定义

在这里插入图片描述
这里push_back会自动添加size和capacity

5.1.2 应用

二叉树的前序遍历

5.2 pop_back(尾删)

使用例子:
在这里插入图片描述

5.3 Insert(指定位置插入)

std::vector::insert

在这里插入图片描述
由于参数的位置是迭代器;所以使用find()函数来实现;
在这里插入图片描述
解释:在position位置之前添加val
** 注意:这里的postion是迭代器;**

5.4 erase

在这里插入图片描述
注意这里的参数也是迭代器;

find(){这个函数可以配套前两个函数使用)

定义
在这里插入图片描述
三个参数:
起始迭代器;中止迭代器;传输的值
注意
这里的参数和返回值都是迭代器;
find ()函数的使用
find函数只有string自己写了,其他容器都是用的是算法库的中的模板版函数(这个模版函数可以被除string以外容器使用)
string容器需要自己写的原因是:string类中需要查找字符串的功能;

5.5swap()

分类:成员函数,全局函数
成员函数是浅拷贝;全局变量是两个指针的交换
在这里插入图片描述
在这里插入图片描述

5.6 clear()

清理数据(size和指针数组,不清理capacity)
如果在使用clear后还想将capacity改位0时:使用shrink_to_fit()函数将capacity改为0;
在这里插入图片描述
这里的输出不知道是12345还是1 2 3 4 5;

vector的使用

应用1

只出现一次的数字
使用异或来解题;

应用2

杨辉三角形
在这里插入图片描述

杨辉三角和二维数组的对比:
二维数组

在这里插入图片描述

杨氏三角

在这里插入图片描述
两者都可以使用下标来访问,但是两者有本质区别:前者是下标的解引用;后者则是函数的调用;
杨氏三角实现leadcode

更多推荐

【Zabbix监控一】zabbix的原理与安装

利用一个优秀的监控软件,我们可以:●通过一个友好的界面进行浏览整个网站所有的服务器状态●可以在Web前端方便的查看监控数据●可以回溯寻找事故发生时系统的问题和报警情况总结:zabbix主要功能监控,cpu负载,内存使用,硬盘使用,网络状态,端口监视,日志监视,插件开发自定义zabbixserver端口号:10500za

【系统架构】分布式系统架构设计

1分布式系统是什么分布式系统是指由多个计算机节点组成的一个系统,这些节点通过网络互相连接,并协同工作完成某个任务。与单个计算机相比,分布式系统具有更高的可扩展性、可靠性和性能等优势,因此广泛应用于大规模数据处理、高并发访问、分布式存储等领域。分布式系统的设计目标是将计算机资源、数据和控制权分布在多个节点上,以提高系统的

使用GGML和LangChain在CPU上运行量化的llama2

MetaAI在本周二发布了最新一代开源大模型Llama2。对比于今年2月发布的Llama1,训练所用的token翻了一倍,已经达到了2万亿,对于使用大模型最重要的上下文长度限制,Llama2也翻了一倍。在本文,我们将紧跟趋势介绍如何在本地CPU推理上运行量化版本的开源Llama2。量化快速入门我们首先简单介绍一下量化的

决策树的划分依据之:信息增益率

在上面的介绍中,我们有意忽略了"编号"这一列.若把"编号"也作为一个候选划分属性,则根据信息增益公式可计算出它的信息增益为0.9182,远大于其他候选划分属性。计算每个属性的信息熵过程中,我们发现,该属性的值为0,也就是其信息增益为0.9182.但是很明显这么分类,最后出现的结果不具有泛化效果.无法对新样本进行有效预测

网络安全(黑客)自学

前言1.不要试图以编程为基础的学习开始学习我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而且实际向安全过渡后可用到的关键知识并不多一般人如果想要把编程学好再开始学习网络安全往往需要花费很长时间,容易半途而废。而且学习编程只是工具不是目的,我们的目标不是成为程序员。建

重新理解 RocketMQ Commit Log 存储协议

最近突然感觉:很多软件、硬件在设计上是有rootreason的,不是bydesgin如此,而是解决了那时、那个场景的那个需求。一旦了解后,就会感觉在和设计者对话,了解他们的思路,学习他们的方法,思维同屏:活到老学到老。问题思考1、ConsumerQueueOffset是连续的吗,为什么?2、CommitLogOffse

Rust 数据类型 之 结构体(Struct)

目录结构体(Struct)定义与声明结构体定义结构体实例结构体分类单元结构体(UnitStruct)元组结构体(TupleStruct)具名结构体(NamedStruct)结构体嵌套结构体方法例1:结构体转换为字符串描述例2:矩形的周长和面积例3:结构体字段的更新与输出关联函数结构体方法与关联函数的区别参数传递方式的区

爬虫工作者必备:使用爬虫IP轻松获得最强辅助

目录一、爬虫IP的作用与优势二、选择合适的爬虫IP服务商三、使用爬虫IP的注意事项和技巧代码示例四、合法合规使用爬虫IP总结随着互联网的发展,数据已经成为企业竞争的核心资源。而获取这些数据的有效方式,就是通过爬虫技术。但是,爬虫在运行过程中很可能会触及到目标网站的限制,从而被禁止访问甚至封号。为了解决这个问题,我们可以

“熊猫杯” | 赛宁网安获网络安全优秀创新成果大赛优胜奖

9月11日,四川省2023年国家网络安全宣传周正式启动。由四川省委网信办指导,中国网络安全产业联盟(CCIA)主办,成都信息工程大学、四川省网络空间安全协会承办的“2023年网络安全优秀创新成果大赛—成都分站赛(暨四川省‘熊猫杯’网络安全优秀作品大赛)”落下帷幕。赛宁网安凭借主动防御安全网格解决方案脱颖而出,荣获大赛优

Hadoop源码阅读(一):NameNode启动

说明:1.Hadoop版本:3.1.32.阅读工具:IDEA2023.1.23.源码获取:Indexof/dist/hadoop/core/hadoop-3.1.3(apache.org)4.工程导入:下载源码之后得到hadoop-3.1.3-src.tar.gz压缩包,在当前目录打开PowerShell,使用tar-

C++中按引用传递参数

C++中按引用传递参数实参通常是通过值传递给函数的,这意味着形参接收的只是发送给它们的值的副本,它们存储在函数的本地内存中。对形参值进行的任何更改都不会影响原始实参的值。然而,有时候可能会希望一个函数能够改变正在调用中的函数(即调用它的函数)中的一个值,这可以通过引用传递的方式来完成。我们知道,变量是可以保存数据的内存

热文推荐