C++ STL vector

目录

一.认识vector

二.vector的使用

1.vector的构造函数

2.vector的迭代器

2.1 begin(),end()

2.2 rbegin(),rend()

2.3 迭代器初始化对象

 3. vector 增删查改

3.1push_back(),pop_back()

3.2  insert(),erase()

3.3 operator[]

 4.vector 空间控制

4.1 size(),capacity(),empty()

4.2 resize(),reserve()


一.认识vector

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

使用STL的三个境界:能用,明理,能扩展 ,那么下面学习vector,我们也是按照这个方法去学习。

二.vector的使用

vector学习时一定要学会查看文档:vector 使用文档 vector的文档介绍,vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。

1.vector的构造函数

 vector支持使用默认构造函数,同时支持模板:

	//<int> 模板类型,存储int的顺序表
	vector<int> v1;
	//存储string的顺序表
	vector<string> v2;
	//存储double的顺序表
	vector<double> v3;
	//存储char的顺序表
	vector<char> v4;

vector 也支持构造并且初始化:


	//构造一个 vector开10个int空间,并全部初始化为2
	vector<int> v1(10, 2);

支持拷贝构造,使用已经创建的对象初始化新的对象:

	//拷贝构造初始化
	vector<int> v2(v1);

2.vector的迭代器

vector容器也是可以使用迭代器的。有了迭代器范围for也就可以使用了。

2.1 begin(),end()

begin()获取第一个数据位置的 iterator/const_iteratorend() 获取最后一个数据的下一个位置的iterator/const_iterator。

	//构造一个 vector开10个int空间,并全部初始化为123
	vector<int> v1(10, 123);
	//vector 迭代器
	//auto it =v1.begin();
	vector<int>::iterator it = v1.begin();
	
	while (it != v1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

 2.2 rbegin(),rend()

rbegin()获取最后一个数据位置的 reverse_iteratorrend()获取第一个数据前一个位置的reverse_iterator

	//构造一个 vector开10个int空间,并全部初始化为123
	vector<int> v1(10, 123);
	//vector 反向迭代器
	//auto rit =v1.rbegin();

	vector<int>::reverse_iterator rit = v1.rbegin();

	while (rit != v1.rend())
	{
		cout << *rit << " ";
		rit++;
	}

2.3 迭代器初始化对象

vector也是支持迭代器区间初始化,而且初始化使用的迭代器区间不仅仅可以是vector的迭代器,也可以是其他容器的迭代器区间,但是要支持数据类型的转换。例如:

	string str("hello C++");
	vector<int> v1(10,2);
	vector<int> v2(v1.begin(), v1.end() - 5);
    //string的迭代器区间初始化
	vector<int> v3(str.begin(), str.end());
	for (auto e : v2)
	{
		cout << e<<" ";
	}
	cout << endl;
	for (auto e : v3)
	{
		cout << e << " ";
	}

 3. vector 增删查改

3.1push_back(),pop_back()

push_back()提供可以在vector尾部插入数据的功能。pop_back()提供可以在尾部删除数据的功能。

	vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	v1.push_back(60);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	v1.pop_back();
	v1.pop_back();
	for (auto e : v1)
	{
		cout << e << " ";
	}

 3.2  insert(),erase()

 insert支持在某一个迭代器位置 position 后进行插入一个val,或者在一个迭代器位置position ,插入 n 个val,也支持使用一段迭代器区间去插入,使用的迭代器区间可以是其他容器的迭代器区间,但是要支持数据类型的转换。

 erase提供了删除某一个迭代器位置的值,或者某一段迭代器区间的值。

vector<int> v1;
	//尾插 30 40 50 60
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	v1.push_back(60);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	//在beginw位置之前插入20 10
	v1.insert(v1.begin(), 20);
	v1.insert(v1.begin(), 10);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	//删除尾部的两个数据
	v1.erase(v1.end()-1);
	v1.erase(v1.end()-1);
	for (auto e : v1)
	{
		cout << e << " ";
	}

 3.3 operator[]

[ ]运算符的重载,支持 vector 像数组一样访问。

	vector<int> v1;
	//尾插 30 40 50 60
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	v1.push_back(60);

	for (int i = 0; i < v1.size(); i++)
	{
		cout << (v1[i]+=10) << " ";
	}

 

 4.vector 空间控制

4.1 size(),capacity(),empty()

size(),返回当前vector存储的数据个数。

capacity()返回当前vector的容量。

empty()判断当前容量是否为空。

4.2 resize(),reserve()

resize 修改当前 vector 的有效数据尾个数,可以增加也可以减少。resize 还可以开空间的同时并初始化,如果 resize 的大小比原 vector size 小是不会影响到容量的大小。如果 resize 的大小比原 vector sizevector 会进行扩容。

	vector<int> v1;
	//尾插 30 40 50 60
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	v1.push_back(60);

	v1.resize(2);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}

 resize 开空间并初始化:

	vector<int> v1;
	//开10个空间,并且全部初始化为 5
	v1.resize(10, 5);

	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}

 reserve可以进行扩充vector的容量,但是并不会初始化开的空间。但是 reserve 并不会缩容。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fairy下载和使用

写在最前&#xff1a;本系列中将会涉及到 Unity&#xff0c;C#&#xff0c;Lua和FairyGUI&#xff08;FGUI&#xff09;。 FairyGUI介绍 官网&#xff1a; FairyGUI 编辑器下载&#xff1a; FairyGUI 截至文档记录最新版&#xff1a; https://res.fairygui.com/FairyGUI-Ed…

现代无人机技术

目录 1.发展 2.应用领域 3.对战争的影响 4.给人类带来的福利 5.给人类带来的坏处 1.发展 无人机的发展可以分为以下几个关键步骤&#xff1a; 1. 早期试验和研究&#xff1a;20世纪初&#xff0c;飞行器的概念开始出现&#xff0c;并进行了一些早期的试飞和实验。这些尝试包…

STM32CubeMX之freeRTOS中断系统

任何中断的优先级都大于任务 优先级是从5-15 而不是0-15 因为前几个已经被freertos所控制了&#xff0c;因为操作系统不是万能的&#xff0c;所以我们需要弄一些中断凌驾在我们操作系统之上&#xff0c;中断中必须使用中断相关的函数&#xff01; 中断不能使用阻塞函数&#…

FinClip 支持小程序维度域名配置;桌面端体验活动进行中

FinClip 的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点&#xff0c;看看是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f…

初识mysql数据库之引入mysql客户端库

目录 一、下载第三方库 1. 准备工作 1. 使用mysql官网提供的库 2. yum源安装 二、测试第三方库是否可用 三、mysql常用接口介绍 1. 查看官方文档 2. 初始化 3. 关闭mysql 4. 连接mysql 5. 下达sql指令 四、一个简单的C客户端库连接mysql程序 1. 头文件 2. 初始化…

计算机组成原理-笔记-第七章

目录 七、第七章——输入输出系统 1、IO设备与IO控制方式 &#xff08;1&#xff09;控制方式&#xff08;查询&#xff0c;中断&#xff0c;DMA&#xff09; &#xff08;2&#xff09;通道控制 &#xff08;3&#xff09;IO系统 &#xff08;4&#xff09;总结 2、外设…

钕铁硼永磁材料基本概念

目录 一、何为磁性材料二、永磁材料的主要性能三、永磁材料的历史四、永磁材料的分类五、钕铁硼永磁材料5.1 产业链5.2 生产工艺 之前也写过其他行业的一些生产过程和工艺流程&#xff0c;大家有兴趣的可以翻翻以前的文章。 一、何为磁性材料 参加过九年义务教育的同学应该都知…

CSS3 中新增了哪些常见的特性?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 圆角&#xff08;Border Radius&#xff09;⭐ 渐变&#xff08;Gradients&#xff09;⭐ 阴影&#xff08;Box Shadow&#xff09;⭐ 文本阴影&#xff08;Text Shadow&#xff09;⭐ 透明度&#xff08;Opacity&#xff09;⭐ 过渡&…

我的Python教程:使用Pyecharts画柱状图

Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库&#xff0c;提供了丰富的图表类型和交互功能。通过 Pyecharts&#xff0c;你可以使用 Python 代码生成各种类型的 Echarts 图表&#xff0c;例如折线图、柱状图、饼图、散点图…

【C++从0到王者】第二十站:模板进阶

文章目录 前言一、typename 和 class的一些区别二、非类型模板参数1.非类型模板参数介绍2.array容器 三、模板的特化1.函数模板的特化2.类模板的特化1.全特化2.偏特化&#xff08;半特化&#xff09; 三、模板的分离编译四、总结 前言 在前面我们使用模板主要是为了解决两类问…

安装docker和案例复现

安装环境 1.安装docker #输入命令 yum install -y yum-utils 安装下载docker的工具包 yum install -y yum-utils # 设置阿里docker镜像仓库地址 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce d…

大数据-玩转数据-Flink-Transform

一、Transform 转换算子可以把一个或多个DataStream转成一个新的DataStream.程序可以把多个复杂的转换组合成复杂的数据流拓扑. 二、基本转换算子 2.1、map&#xff08;映射&#xff09; 将数据流中的数据进行转换, 形成新的数据流&#xff0c;消费一个元素并产出一个元素…

阻塞队列_线程安全版本_生产消费者模型

前言 在前面PriorityQueue优先级队列_Y君的进化史的博客-CSDN博客&#xff0c;我们学习了优先级队列&#xff0c;但是发现&#xff0c;当一个线程将优先级队列使用完之后&#xff0c;会自动退出程序&#xff0c;如果此时我们想使其一直等待到下一个任务的录入&#xff0c;就需…

面试热题(LRU缓存)

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -1 …

信息论基础知识

注意&#xff1a;本文只针对离散随机变量做出探讨&#xff0c;连续随机变量的情况不适用于本文探讨的内容&#xff01; &#xff08;一&#xff09;自信息 1. 自信息 I ( x ) − l o g n P ( x ) \color{blue}I(x) - log_{n}{P(x)} I(x)−logn​P(x) 注意&#xff1a; 若n …

亚马逊 EC2服务器下部署java环境

1. jdk 1.8 安装 1.1 下载jdk包 官网 Java Downloads | Oracle tar.gz 包 下载下来 1.2 本地连接 服务器 我用的是亚马逊的ec2 系统是 ubuntu 的 ssh工具是 Mobaxterm , 公有dns 创建实例时的秘钥 链接 Mobaxterm 因为使用的 ubuntu 所以登录的 名称 就是 ubuntu 然后 …

Linux centos 常用命令 【持续更新】

一、查看文件信息 indoe和目录项 # df命令查看每个硬盘分区的inode总数和已经使用的数量 df -i# 查看inode的大学 xfs_growfs /dev/sda1|grep "isize"# 查看文件的indoe号码 ls -istat查看文件信息 # 文件的详细信息 stat anaconda-ks.cfg # -t参数是在一行内输出…

Linux 的基本指令(3)

指令1&#xff1a;date 作用&#xff1a;用来获取时间的指令。 1. 获取当下的时间&#xff1a; date %Y-%m-%d_%H:%M:%S 其中&#xff1a;%Y 表示年&#xff0c;%m 表示月&#xff0c;%d 表示日&#xff0c;%H 表示 小时&#xff0c;%M 表示分&#xff0c;%S 表示秒。 上面代…

用 oneAPI 实现 AI 欺诈检测:一款智能图像识别工具

简介 虚假图像和视频日益成为社交媒体、新闻报道以及在线内容中的一大隐患。在这个信息爆炸的时代&#xff0c;如何准确地识别和应对这些虚假内容已经成为一个迫切的问题。为了帮助用户更好地辨别虚假内容&#xff0c;我开发了一款基于 oneAPI、TensorFlow 和 Neural Compress…

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息&#xff1a;properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…