【STL】vector快速上手

news2024/11/26 8:33:22

目录

一,vector的模板特性

二,vector基本使用

1. 构造函数

2. operator=  赋值

3. vector——增删

A,  尾插 && 尾删 

B,insert

C,  erase 

4. 访问vector

遍历vector中元素:

法一:数组[]法  || at法

法二:迭代器法

语法糖——for 

三,应用

1. 排序

2. vector + string


一,vector的模板特性

      STL中的vector是一个动态数组容器,它可以存储任意类型的元素。vector的模板构造函数可以通过不同的参数来实现不同的初始化方式。

从STL中就会发现:

    vector<int> s1;
    vector<double> s2;
    vector<char> s3;

    vector<string> s4   // 数据类型是string类

二,vector基本使用

1. 构造函数

常见的有:

    vector<int> s1;         // 设置一个不包含任何元素的空对象
	vector<int> s2(3);      //设置3个初始值为默认值的vector对象
	vector<int> s3(3, 20);  // 三个初始值为20的vector对象
	// 以及还有迭代器的函数,这里留到讲解vector迭代器再讲
	vector<int> s4(s3);     // 拷贝构造

结果:

2. operator=  赋值

vector<int> s5 = s3;    // vector对象之间的赋值

3. vector——增删

      vector中没有头插 && 头删,相应的有insert(插入) && erase(删除) 

A,  尾插 && 尾删 

 // 添加数据的值
    s1.push_back(10);  // 添加一个数据10
    s1.push_back(20);
    s1.push_back(30);
    s1.pop_back();  // 删除尾部元素
    s1.pop_back();

B,insert

 vector<int> s1; 
 s1.push_back(10);
 s1.push_back(10);
 s1.push_back(30);
 s1.push_back(21);
 vector<int>::iterator pos =  find(s1.begin(), s1.end(), 20);
	if (pos != s1.end()) //find()函数如果没有匹配的化会返回最后一个有效数据的下一个位置,
	 //                      没有判断则尾插,不符合判断插入的逻辑。
	{
		s1.insert(pos, 100); // pos为插入位置的迭代器,100则是插入值
	}

	for (auto i : s1)
	{
		cout << i << " ";
	}

// 结果是 10 10 30 21

 (注意:find()算法函数包含在 algorithm 头文件中)

C,  erase 

共两种,一个是删除单个元素,一个则是范围删除,都是通过迭代器进行操作。

v1.erase(v1.begin() + 3);  // 删除第三个元素
v1.erase(v1.begin(), v1.end() - 1);  // 删除前v1.end() - 1个元素

4. 访问vector

常见的:

    s1[0];
	s1[2];
	s1.front();  // 返回头元素引用
	s1.back();   // 返回尾元素引用

遍历vector中元素:

法一:数组[]法  || at法

    s1.push_back(10);
	s1.push_back(20);
	s1.push_back(30);

	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << endl; // s1[i]可换成s1.at(i)后者用的少
        // 都是返回数据的引用
	}

法二:迭代器法

    vector<int>::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

语法糖——for 

同时,支持迭代器也支持语法糖for,其底层会被替换为迭代器。

挪:

for (auto i : s1)
	{
		cout << i << endl; 
	}

其访问结果跟迭代器一模一样。

三,应用

  前面我们了解了vector的使用,学过string类会发现vector没有什么特别新颖的地方。这里我们来做一些小知识点扩展。

1. 排序

这里用到STL中排序算法函数 sort() 

如你所见,sort函数通过函数模板实现功能,而其底层使用的是快排算法

如下:

    vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(21);
	v1.push_back(32);
	sort(v1.begin(), v1.end());
	for (auto e : v1)
	{
		cout << e << " ";
	}
	// 升序:10 20 21 30 32 40

sort函数默认为升序,那如何改为降序呢?

 使用第二个重载函数如下:

    vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(21);
	v1.push_back(32);

	sort(v1.begin(), v1.end());
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	// 升序:10 20 21 30 32 40
    
    // 库函数中有两个仿函数
	less<int> ls;  // 默认的升序就是他
	greater<int> gt; // 降序
	sort(v1.begin(), v1.end(), gt);
	for (auto e : v1)
	{
		cout << e << " ";
	}
    //降序:40 32 30 21 20 10

当然网络上也有这样的简易写法:

  sort(v1.begin(), v1.end(), greater<int>());

而这里用到了匿名对象(less 与 greater是类)。

2. vector + string

    我们知道vector是泛性编程,那么当数据类型为自定义类型呢?  如:string类时,会有怎样的不同?

 代码如下:

    vector<string> strv;
	string s1 = "张三";
	strv.push_back(s1);  // 调用拷贝构造
	strv.push_back(string("张三"));  // 使用了匿名对象,具有临时对象的性质(const string)
	// 本质上string使用了拷贝构造,操作还是比较繁琐。
	strv.push_back("张三");  // 大部分时候是这样一种写法,使用了string的构造

好,下面我们来用范围for 进行 遍历输出,请看下面代码,是否有不合理的地方?

int main()
{
	vector<string> strv;
	string s1 = "张三";
	strv.push_back(s1);  // 调用拷贝构造
	strv.push_back(string("张三"));  // 使用了匿名对象,具有临时对象的性质(const string)
	// 本质上string使用了拷贝构造,操作还是比较繁琐。
	strv.push_back("张三");  // 大部分时候是这样一种写法,使用了string的构造

	for (auto str : strv)
	{
		cout << str << endl;
	}
	return 0;
}

解析:应为 auto&  str  :  strv 。我们知道这次vector容器中的数据是string类,而范围for的功能是将strv中的数据赋值给str, string类赋值给string类这不是拷贝构造吗?那么每次赋值都是深拷贝,性能大浪费,所以应为auto& str : strv(如果严谨一些:不能修改数据,前面用const修饰) 

这里有一个使用关于vector的算法题:118. 杨辉三角

 

补充:vector的双括号

 

 从本质来说,下标双括号是调用了两次函数调用

以上vector常见的用法,如果想要继续了解其他用法,需要查看文档:Reference - C++ Reference (cplusplus.com) 

结语

本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论;如果给小伙伴带来一些收获请留下你的小赞,你的点赞和关注将会成为博主创作的动力。

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

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

相关文章

HashMap-JDK8源码讲解及常见面试题

数据结构 红黑树 在JDK8中&#xff0c;优化了HashMap的数据结构&#xff0c;引入了红黑树。即HashMap的数据结构&#xff1a;数组链表红黑树。HashMap变成了这样。 为什么要引入红黑树 1、主要是为了提高HashMap的性能&#xff0c;即解决发生hash冲突后&#xff0c;因为链…

一些总结-C++

1.spdlog 需要安装spdlog库&#xff0c;然后连接器增加-lspdlog 不需要复制头文件到目录&#xff0c;安装到机器上之后&#xff0c;从系统目录加载头文件即可。 部分用法&#xff1a; 2.redis 需要安装hiredis库&#xff0c;链接器-lhiredis 不需要复制头文件到目录&#…

Java Web HTTP 23.7.4

HTTP 1&#xff0c;Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在我们日常的生活中&#xff0c;经常会使用浏览器去访问百度、京东等这些网站&#xff0c;这些网站统称为Web网站。如下就是通过浏…

Linux学习之i节点(inode)和数据块操作

touch testfile创建一个空文件testfile。 stat testfile可以看一下文件的inode信息。 ls -li testfile看一下testfile相关信息。 上图中922208是inode号码&#xff0c;也称为inode编号&#xff0c;若是使用ls -i testfile就可以直接看到inode号码。 du -h testfile可以看…

【Unity3D 问题总结】☀️ | 解决LayoutGroup配合Content Size Fitter使用时发生子成员位置错乱问题

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…

Android、iOS快速全球化工具

动机 在进行移动端全球化的时候&#xff0c;我们需要根据语言类型准备格式相同&#xff0c;文本不同的好多个文件&#xff0c;如果一个一个翻译显然很浪费时间&#xff0c;如果整篇复制到Google翻译通常翻译出来的文本是没办法直接用的&#xff0c;所以我通过有道云API实现了一…

AIGC:【LLM(三)】——JARVIS:连接ChatGPT和HuggingFace解决AI问题

文章目录 0.摘要1.引言2.相关工作3.HuggingGPT3.1 任务规划3.2 模型选择3.3 任务执行3.4 响应生成 4.限制5.结论6.参考资料 0.摘要 解决具有不同领域和模态的复杂人工智能任务是通往人工通用智能的关键骤。尽管存在丰富的适用于不同领域和模态的人工智能模型&#xff0c;但它们…

Linux系统之iostat命令的基本使用

Linux系统之iostat命令的基本使用 一、iostat命令介绍二、iostat命令帮助1.1 iostat的帮助信息1.2 iostat的选项解释 三、iostat命令的基本使用3.1 查看iostat工具版本3.2 直接使用iostat命令3.3 间隔5秒查看3次信息3.4 只查看磁盘状态3.5 以k或M为单位显示信息 四、查看磁盘I/…

JMM 规范

JMM是Java Memory Model&#xff08;Java 内存模型&#xff09;的缩写&#xff0c;是Java虚拟机规范中定义的一套规则&#xff0c;用来规范Java程序在多线程环境下的内存访问方式。其主要作用是保证多线程之间的数据可见性、有序性和原子性。JMM规范定义了一些程序员和JVM实现者…

机器学习(ML)策略

目录 1、正交化的概念 2、单一数字评估指标&#xff08;Single number evaluation metric&#xff09; 3、训练/开发/测试集划分 4、迁移学习 5、多任务学习 6、端到端深度学习 1、正交化的概念 正交化是机器学习中一种常用的数据预处理技术&#xff0c;用于减少特征之间…

IMX6ull SPI 协议

一 SPI 简介 1.1 SPI SPI 全称是 Serial Perripheral Interface&#xff0c;也就是串行外围设备接口。 SPI 是 Motorola 公司推出的一种同步串行接口 技术&#xff0c;是一种高速、全双工的同步通信总线&#xff0c; SPI 时钟频率相比 I2C 要高很多&#xff0c;最高可以工作 …

【IT服务管理】MITRE :IT服务管理

定义&#xff1a; 信息技术 (IT) 服务管理 (ITSM) 是解决管理、支持和交付 IT 服务的最佳实践的框架、流程和模型的通用保护伞。IT 服务可能包括&#xff08;由 NIST 为云计算定义&#xff09;&#xff1a;软件即服务 (SaaS)、平台即服务 (PaaS) 和基础设施即服务 (IaaS)。 关键…

DevExpress WPF Scheduler组件,快速构建性能优异的调度管理器!(下)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;我们介绍了DevExpress WPF Scheduler组件中的日历视图、时间轴视图等&#xff0c;在本文中我们将继续带大家了解Scheduler组件的UI/UX自定义等其他功能。 DevExpress WPF拥有120个控件和库&#xff0c;将帮助…

Spring Boot 61:JPA 中的级联类型

Spring Boot 61&#xff1a;JPA 中的级联类型 图源&#xff1a;简书 (jianshu.com) 关系型数据库的增删改查操作会因为有关联关系而存在“级联操作”的需要&#xff0c;体现在 JPA 中&#xff0c;就是实体中会定义的级联类型&#xff08;Cascade Type&#xff09;。 JPA 中的…

【二维属性+贪心+双指针】ABC 195 D

D - Shipping Center (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 经典中的经典&#xff0c;二维属性&#xff0c;对于其中的一个关键字排序&#xff0c;然后双指针将合法的可行解放入容器中&#xff0c;再去容器中找最优解&#xff0c;用双指针是因为它具有单调性 这里…

18-Linux 常用命令

目录 1.ls PS&#xff1a;FinalShell设置背景和字体 2.pwd 3.cd PS&#xff1a;认识 Linux 目录结构——Linux 是一个树形目录结构 PS&#xff1a;绝对路径 vs 相对路径 PS&#xff1a;使用 tab 键补全 PS&#xff1a;使用 ctrl c 重新输入 4.touch PS&#xff1a;L…

基于梯度下降算法的无约束函数极值问题求解

基于梯度下降算法的无约束函数极值问题求解 1 知识预警1.1导数1.2偏导数1.3方向导数1.4梯度 2 梯度下降算法3 无约束函数极值问题求解3.1 算例13.1.1 Python编程求解3.1.2 求解结果与可视化 3.2 算例2 Rosenbrock函数3.2.1 Python编程求解3.2.2 求解结果与可视化 1 知识预警 1…

JSON多层级数据自动映射值优化

JSON多层级数据自动映射值优化 FieldMethodHandles结果分析 Spring boot装载模板代码工程中&#xff0c;JSON多层级数据自动映射值只是简单封装JsonPath&#xff0c;对DTO的声明字段做foreach轮询&#xff0c;检查字段注解JPath&#xff0c;然后从JsonPath的解析缓存中读取JPat…

数字孪生三维可视化在海洋能源开发中的应用有哪些?

数字孪生是一种将现实世界中的实体、系统或过程在虚拟世界中重构&#xff0c;并相互映射和交互的领先技术。在能源领域&#xff0c;数字孪生技术可谓大有作为&#xff0c;比如通过实时监测和分析各种数据&#xff0c;提高能源的利用效率、降低能源成本、优化能源分配&#xff0…

【零基础入门学习Python---Python中机器学习和人工智能之快速入门实践】

&#x1f680; 零基础入门学习Python&#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜…