C++ STL vector

news2025/1/19 3:07:16

目录

一.认识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 并不会缩容。

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

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

相关文章

宝塔Linux面板点击SSL闪退打不开?怎么解决?

宝塔Linux面板点击SSL证书闪退如何解决&#xff1f;旧版本的宝塔Linux面板确实存在这种情况&#xff0c;如何解决&#xff1f;升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法&#xff1a; 宝塔面板点击SSL证书闪退解决方法 问题&#xff1a;宝塔Linux面板…

【脚踢数据结构】链表(1)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…

【果树农药喷洒机器人】Part3:变量喷药系统工作原理

文章目录 一、变量喷药系统工作原理二、液压通路设计与控制系统封装2.1液压通路设计2.2 控制系统总体封装 三、喷头测定与布置实验3.1喷雾角度测定实验3.2确定喷头布置间距 一、变量喷药系统工作原理 果树喷药机器人通过现代测量技术获取果树冠层参数信息&#xff0c;并对获取…

【Linux:线程池】

文章目录 1 线程池概念2 第一个版本的线程池3 第二个版本的线程池4 第三个版本的线程池5 STL中的容器以及智能指针的线程安全问题6 其他常见的各种锁7 读者写者问题(了解) 1 线程池概念 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而…

16-2_Qt 5.9 C++开发指南_使用样式表Qss自定义界面

进行本篇介绍学习前&#xff0c;请先参考链接01_1_Qt工程实践_Qt样式表Qss&#xff0c;后再结合本篇进行融合学习如何使用样式表定义界面。 文章目录 1. Qt样式表2. Qt样式表句法2.1 一般句法格式2.2 选择器 (selector)2.3 子控件&#xff08;sub-controls&#xff09;2.4 伪状…

neo4j的CQL命令实例演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

vim学习笔记(致敬vim作者)

vim cheat sheet 30. vim 删除大法 vim 删除某个字符之后改行的其他的字符&#xff1f;删除某行之后的其他行&#xff1f;删除某个字符之后的其他字符&#xff1f;【1】删除单个字符&#xff1f; 跳到要删除的字符位置 按下d键然后按下shift 4键 【2】删除某行之后的其他行…

List list=new ArrayList()抛出的ArrayIndexOutOfBoundsException异常

1.应用场景&#xff0c;今天生产日志监控到一下ArrayList 进行add 异常&#xff0c;具体日志如下&#xff1a; eptionHandler.handler(178): TXXYBUSSINESS|执行异常 java.util.concurrent.CompletionException: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bo…

激活函数总结(一):ReLU及其变体

激活函数介绍&#xff08;一&#xff09; 1 引言2 常用激活函数介绍2.1 Sigmoid激活函数2.2 Tanh激活函数2.3 ReLU激活函数2.4 Leaky ReLU激活函数2.5 Parametric ReLU&#xff08;PReLU&#xff09;激活函数2.6 Swish激活函数 3. 总结 介绍的激活函数都在目录中有所展示&#…

VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答、图文匹配、图片分类、常识推理等

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

DROP USER c##xyt CASCADE > ORA-01940: 无法删除当前连接的用户

多创建了一个用户&#xff0c;想要给它删除掉 一 上执行过程&#xff0c;确实删除成功了 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing optionsSQL> DR…

用excel格式书写的接口用例执行脚本

创建测试用例和测试结果集文件夹&#xff1a; excel编写的接口测试用例如下&#xff1a; 1 encoding 响应的编码格式。所测项目大部分是utf-8&#xff0c;有一个特殊项目是utf-8-sig 2 params 对应requests的params 3 data&#xff0c;对应requests的data 有些参数是动态的&a…

C#,数值计算——查找等价类(Find equivalence classes)的计算方法及其源程序

1 等价类的定义 2 Examples 3 Partitions 4 C#源代码 using System; namespace Legalsoft.Truffer { /// <summary> /// Find equivalence classes /// </summary> public class EClass { public EClass() { } pub…

有没有好用的在线画图工具推荐?

绘画是设计师最常见的工作之一&#xff0c;设计师对在线绘画工具的要求越来越高&#xff0c;市场上也出现了各种在线绘画工具&#xff0c;让设计师不知道如何选择高质量的在线绘画工具&#xff0c;一个好的在线绘画工具不仅可以让你轻松绘画&#xff0c;而且可以让你的工作效率…

android studio内存分析之Memory profiler的使用

目录 Android Studio中内存分析工具Memory profiler的使用1. 打开Memory Profiler2. 工具使用3. 内存选项说明4. 内存性能分析器概览5. 内存计算方式6. 查看内存分配7. 捕获java/kotlin方式查看内存分配8. 堆转储文件导入和导出 内存性能分析器中的泄漏检测 Android Studio中内…

带你了解—使用Ubuntu系统,公网环境下SSH远程树莓派

公网环境下Ubuntu系统SSH远程树莓派 文章目录 公网环境下Ubuntu系统SSH远程树莓派前言 1. 安装cpolar客户端2. 安装完成后输入指令3. ubuntu系统输入命令 前言 树莓派作为低功耗、小型化的硬件设备&#xff0c;其功能和运算能力并未过度缩水&#xff0c;在不少场景中&#xff…

UEditorPlus v3.3.0 图片上传压缩重构,UI优化,升级基础组件

UEditor是由百度开发的所见即所得的开源富文本编辑器&#xff0c;基于MIT开源协议&#xff0c;该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器&#xff0c;主要做了样式的定制&#xff0c;更符…

基于spring boot的餐饮管理系统java酒店饭店菜谱 jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于spring boot的餐饮管理系统j 系统1权限&#xff…

Python实现GA遗传算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

利用Jmeter做接口测试全流程分析

利用Jmeter做接口测试怎么做呢&#xff1f;过程真的是超级简单。 明白了原理以后&#xff0c;把零碎的知识点填充进去就可以了。这篇文章就来介绍一下如何利用Jmeter做接口测试的流程&#xff0c;主要针对的是功能测试。暂不涉及到自动化测试和性能测试的内容。 一把来说&…