C++:Vector的使用

news2024/12/24 10:01:17

一、vector的介绍

vector的文档介绍

1. vector是表示可变大小数组的序列容器。

2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。

6. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起listforward_list统一的迭代器和引用更好。

   下面我们开始研究他的使用,为了能够更好的测试,我们先实现一个打印容器元素的函数,vector底层是数组,所以有三种访问方式:下标访问、迭代器访问、范围for(本质也是迭代器)

void Print(const vector<int>& vv)//专门用来打印函数
{
	//下标遍历
	for (size_t i = 0; i < vv.size(); ++i)
		cout << vv[i] << " ";
	cout << endl;
	//迭代器区间访问
	vector<int>::const_iterator it = vv.begin();
	while (it != vv.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//范围for访问
	for (auto e : vv)
		cout << e << " ";
	cout << endl;
}

二. 构造和赋值重载(Member functions)

我们用test1()来展示用法 

void test1()
{
	//无参构造
	vector<int> v1;
	Print(v1);
	//有参构造,n个位置初始化
	vector<int> v2(5,2);
	Print(v2);
	//有参构造,n个位置调用T类型的默认构造
	vector<int> v3(5);
	Print(v3);
	//拷贝构造
	vector<int> v4(v3);
	Print(v4);
	//迭代器区间构造(传string的迭代器区间)
	string s("hello world");
	vector<int> v5(s.begin(), s.end());
	Print(v5);
	//迭代器区间构造(传vctor的迭代器区间)
	vector<int> v6(v5.begin(), v5.end());
	Print(v6);
	//赋值重载
	v1 = v6;
	cout << &v1 <<"   "<< & v6 << endl;//深拷贝
	Print(v1);
	//特殊的赋值方式
	vector<int> v7{ 1,2,3,4,5,6,7,8 };
	Print(v7);
}

 注意:如上图所说,虽然构造函数的本质是为了自定义类型而生的,但是因为有了模版的存在,在有些时候必须支持内置类型的默认构造,比如我们来看下面的测试

//有些必要的时候必须得有拷贝构造
template<class T>
void func()
{
	T x = T();
	cout << x << endl;
}
void test4()
{
	//有模板的时候必须有内置类型的默认构造
	func<int>();
	func<int*>();
	func<double>();
	func<float>();
}

 除了指针以外的内置类型也可以直接进行默认构造

三、增删操作(Modifiers  Iterators)

我们先介绍再测试

     原有的空间会全部清空,替换成我们要插入的元素,如果插入的更大,会扩容到相应的大小,跟=很相似,因为都会造成原来空间的释放,但是assign有一个比较厉害的地方就是可以用迭代器,也就是说我们可以控制被替换的区间

 尾插

 尾删

     指定位置插入,要注意的是这里不再像string一样,用的size_t 的pos,vector虽然也可以用下标访问,但是为了承接后面STL其他不支持下标访问的容器,所以这边的pos用的是迭代器类型

 指定位置删除

 交换两个容器的指针,其实只是交换了空间,跟全局的swap区别就是全局的swap还涉及到了开空间和拷贝

很简单,就是清空容器,但是是不会改变容量的!

下面我们用test2()来进行测试

void test2()
{
	vector<int> v1;
	//push_back
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(7);
	v1.push_back(8);
	Print(v1);
	//pop_back
	v1.pop_back();
	Print(v1);
	//insert
	vector<int>::iterator pos1 = find(v1.begin(), v1.end(),2);
	v1.insert(pos1, 10);
	Print(v1);
	//erase
	vector<int>::iterator pos2 = find(v1.begin(), v1.end(), 10);
	v1.erase(pos2);
	Print(v1);
	//swap(vector 的swap)
	vector<int> v2(40,2);
	cout << &v1 << "  " << &v2<<endl;
	v2.swap(v1);
	cout << &v1 << "  " << &v2<<endl;
	Print(v1);
	Print(v2);
	//swap(全局的swap)
	swap(v1, v2);
	cout << &v1 << "  " << &v2 << endl;
	Print(v1);
	Print(v2);
	//assign和=的区别  都会销毁源空间,但是assign可以用迭代器控制被赋值的范围    或者是自己指定替换n个相同元素
	v1.assign(10, 2);//强行替换了
	Print(v1);
	v1.assign(v2.begin()+5,v2.end()-1);//控制赋值返回
	Print(v1);
	v2 = v1;
	Print(v2);
	//clear
	v1.clear();
	Print(v1);//v1被清空了
	
}

注意:Vector里面并没有提供find,但是算法库里有一个find是迭代器区间版本,也就是说算法库里的find支持给STL所有容器使用,所以才没有必要单独写一个!!

 四、容量相关操作(Capacity)

 这里和之前string的没什么差异,我们直接开始用test3进行测试

//Capacity
void test3()
{
	vector<int> v1{ 1,2,3,4,5,6,7,8,9,10};
	cout << v1.size() << endl;
	cout << v1.max_size() << endl;
	cout << v1.capacity() << endl;
	//reserve
	v1.reserve(15);
	cout << v1.capacity() << endl;
	//resize   //不传参数,调用默认构造
	v1.resize(50);
	Print(v1);
	//empty
	cout << v1.empty() << endl;
	//shrink_to_fit
	v1.reserve(100);
	cout << v1.capacity() << endl;
	v1.shrink_to_fit();
	cout << v1.capacity() << endl;
}

 五、sort和reverse

这两个函数都是算法库里提供的,需要我们传相应的迭代器,但是内部使用是对迭代器有要求的,迭代器功能分为3种,一种是单向(比如单链表),一种是双向(双向链表),一种是随机(Vector和String),支持随机迭代器的一般都是支持下标访问的,名字会按时你要传什么样的迭代器。比如sort,一般只支持随机迭代器,而reverse一般支持双向迭代器,但是随机迭代器也是可以的,也就是说他们之间的关系是:单向支持双向和随机,双向支持随机,随机谁也不能支持

 我们下面用test5()来测试一下

void test5()
{
		vector<int> v1{3,4,10,11,31,43,5464,4242432,22,3213};
	Print(v1);
	//升序
	sort(v1.begin(), v1.end(),less<int>());
	Print(v1);
	//逆序
	sort(v1.begin(), v1.end(), greater<int>());
	reverse(v1.begin() + 2, v1.end() - 5);
	Print(v1);
}

 测试用例都给大家了,大家可以自己用vs拷贝过去哦!下一章开始讲解Vector的模拟实现

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

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

相关文章

解决win10系统cmd命令无法使用ssh问题

目录 问题说明&#xff1a;在使用ssh命令连接虚拟机地址时&#xff0c;出现了以下报错&#xff1a;​编辑 解决方法如下&#xff1a; 1.打开Windows设置&#xff0c;搜索点击添加可选功能&#xff1a; 2.点击添加功能&#xff1a; 3.安装Open SSH客户端和Open SSH服务器: …

基于Python3的数据结构与算法 - 10 计数排序

一、问题 对列表进行排序&#xff0c;已知列表中的数范围都在0到100之间。设计时间复杂度为O(n)的算法。 二、解决思路 我们已知数字的范围&#xff0c;那么我们可以将数字的个数得到&#xff1a; 例如&#xff1a;有一个0~5的列表 [1,3,2,4,1,2,3,1,3,5] 则共有0个0&am…

Tomcat(二) 动静分离

一、(TomcatNginx)动静分离 1、单机反向代理 利用 nginx 反向代理实现全部转发至指定同一个虚拟主机 客户端curl www.a.com 访问nginx服务&#xff0c;nginx服务通过配置反向代理proxy_pass www.a.com:8080&#xff0c;最终客户端看到的是www.a.com 实验中&#xff1a;7-3 做客…

保姆级GeoWebCache矢量瓦片切片流程

1矢量切片解决方案 1.1Geoserver配置geowebcache插件 参考文章 (53条消息) 独立安装geoservergeowebcache发布arcgis切片服务_itouch_ok的专栏-CSDN博客 1.将下载好的geoserver 2.19.3安装部署 将下载好的geowebcache 2.19.3的war包解压到 GeoServer 安装目录下./usr/loc…

两天学会微服务网关Gateway-Gateway HelloWorld快速入门

锋哥原创的微服务网关Gateway视频教程&#xff1a; Gateway微服务网关视频教程&#xff08;无废话版&#xff09;_哔哩哔哩_bilibiliGateway微服务网关视频教程&#xff08;无废话版&#xff09;共计17条视频&#xff0c;包括&#xff1a;1_Gateway简介、2_Gateway工作原理、3…

SpringBoot 自定义映射规则resultMap collection一对多

介绍 collection是封装一对多关系的&#xff0c;通常情况下是一个列表&#xff0c;association是一对一&#xff0c;通常情况是一个对象。例如&#xff1a;查询班级下所有的学生&#xff0c;一个班级可以有多个学生&#xff0c;这就是一对多。 案例 有一个学生表&#xff0c…

重构笔记系统:Docker Compose在微服务架构中的应用与优化

虽然我的笔记系统的开发是基于微服务的思想&#xff0c;但是在服务的配置和编排上感觉还是不太合理&#xff0c;具体来说&#xff0c;在开发上的配置和在生产上的配置差别太大。现在规模小&#xff0c;后面规模变大&#xff0c;估计这一块会成为系统生长的瓶颈。 因此&#xff…

优先级队列(Java )

目录 一、 优先级队列1、概念 二、优先级队列的模拟实现1、堆的概念2、堆的存储方式 三、堆的创建1、堆向下调整2、堆的创建3、建堆的时间复杂度 四、堆的插入与删除1、堆的插入2、堆的删除 五、用堆模拟实现优先级队列 一、 优先级队列 1、概念 优先级队列&#xff08;Priori…

Windows Docker 部署 Jenkins

一、简介 今天介绍一下在 Windows Docker 中部署 Jenkins 软件。在 Windows Docker 中&#xff0c;分为两种情况 Linux 容器和 Windows 容器。Linux 容器是通常大多数使用的方式&#xff0c;Windows 容器用于 CI/CD 依赖 Windows 环境的情况。 二、Linux 容器 Linux 容器内部…

vue中使用echarts实现人体动态图

最近一直处于开发大屏的项目&#xff0c;在开发中遇到了一个小知识点&#xff0c;在大屏中如何实现人体动态图。然后看了下echarts官方文档&#xff0c;根据文档中的示例调整出来自己想要的效果。 根据文档上发现 series 中 type 类型设置为 象形柱形图&#xff0c;象形柱图是…

[HackMyVM]靶场 Quick3

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (U…

解密Lawnchair:打造个性化极致的Android桌面体验

解密Lawnchair&#xff1a;打造个性化极致的Android桌面体验 1. 简介 Lawnchair是一款知名的Android桌面定制工具&#xff0c;旨在为用户提供个性化极致的桌面体验。作为一个开源项目&#xff0c;Lawnchair融合了简洁、灵活和强大的特点&#xff0c;让用户能够自由定制其Andro…

b站小土堆pytorch学习记录—— P17 土堆说卷积操作

文章目录 一、前置知识什么是卷积操作 二、代码 一、前置知识 什么是卷积操作 推荐几个高赞博客&#xff1a; 卷积最容易理解的解释 卷积神经网络&#xff08;CNN&#xff09;详细介绍及其原理详解 还有pytorch官网的动态图&#xff1a; pytorch卷积 二、代码 import t…

免费的ChatGPT网站( 7个 )

ChatGPT 是由 OpenAI 公司研发的一款大型语言模型&#xff0c;它可以实现智能聊天、文本生成、语言翻译等多种功能。以下是 ChatGPT 的详细介绍&#xff1a; 智能聊天&#xff1a;ChatGPT 可以与用户进行自然语言对话&#xff0c;回答用户的问题&#xff0c;提供相关的信息和建…

通义千问1.5(Qwen1.5)大语言模型在PAI-QuickStart的微调与部署实践

作者&#xff1a;汪诚愚&#xff08;熊兮&#xff09;、高一鸿&#xff08;子洪&#xff09;、黄俊&#xff08;临在&#xff09; Qwen1.5&#xff08;通义千问1.5&#xff09;是阿里云最近推出的开源大型语言模型系列。作为“通义千问”1.0系列的进阶版&#xff0c;该模型推出…

S4---FPGA-K7板级原理图硬件实战

视频链接 FPGA-K7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-K7板级原理图硬件实战 基于XC7K325TFFG900的FPGA硬件实战框图 基于XILINX 的KINTEX-7 芯片XC7K325FPGA的硬件平台&#xff0c;FPGA 开发板挂载了4 片512MB 的高速DDR3 SDRAM 芯片&#xff0c;另外板上带有一个SODIM…

Python爬虫实战(基础篇)—13获取《人民网》【最新】【国内】【国际】写入Word(附完整代码)

文章目录 专栏导读背景测试代码分析请求网址请求参数代码测试数据分析利用lxml+xpath进一步分析将获取链接再获取文章内容测试代码写入word完整代码总结专栏导读 🔥🔥本文已收录于《Python基础篇爬虫》 🉑🉑本专栏专门针对于有爬虫基础准备的一套基础教学,轻松掌握Py…

深度学习-Pytorch实现经典VGGNet网络

深度学习-Pytorch实现经典VGGNet网络 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰&#xff0c;打…

数据可视化原理-腾讯-3D网格热力图

在做数据分析类的产品功能设计时&#xff0c;经常用到可视化方式&#xff0c;挖掘数据价值&#xff0c;表达数据的内在规律与特征展示给客户。 可是作为一个产品经理&#xff0c;&#xff08;1&#xff09;如果不能够掌握各类可视化图形的含义&#xff0c;就不知道哪类数据该用…

【Leetcode每日一刷】动态规划算法: 62. 不同路径、63. 不同路径 II

博主简介&#xff1a;努力学习和进步中的的22级计科生博主主页&#xff1a; Yaoyao2024每日一句: “ 路虽远&#xff0c;行则将至。事虽难&#xff0c;做则可成。” 前言 前言&#xff1a;动规五部曲 以下是《代码随想录》作者总结的动规五部曲 确定dp数组&#xff08;dp tab…