C++STL初阶(4):初识vector

news2024/11/18 8:35:04

       vector是一个类模版,是一个顺序容器,底层思维就是顺序表,而顺序表的本质就是一个可以改变size的数组。本篇基于string的学习基础,我们对vector进行一个大致的了解和学习


1.基本介绍

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

 2.vector基础操作 

2.1构造函数 

      正如上文所说,vector是类模版,类模版的本质是写给编译器用的,以实现泛型编程。

 函数传对象,模版传类型,后者是在编译的时候传的,编译器会根据你传入的类型通过模版自动生成一个相应的vector

                                         

vector的数组是所有类型的数组。

对于string和vector<char>的区别,前者是基于“串”而存在的概念,后者是基于“单个字符”而存在的概念。所以vector没有append和+=的概念。

string是专门针对char的数组设计的,vector是针对所有类型的数组设计的。

      无参构造和拷贝构造是重点。也可以通过中括号里加参数给vector赋值。也就是:

vector<char>{'a','b'};

对于第一个无参构造,第一个参数(value_type)类型对应底层是一个什么类型的数组,第二个参数(allocator_type)有缺省值,allocator是空间配置器,也就是内存池,通过该空间配置器会给vector开空间。

对于第二个赋值构造,我们也可以使用如下:

             

                                              (最后两排是其他用法)

对于参数的缺省值value_type()和allocator_type(),就像int()一样,表示创建一个匿名对象。

在C++中有默认的构造函数的,int()就是0,char()就是\0,而如果是自定义类型就会调用默认构造。

    


2.2 遍历vector

如何遍历?正如上文,vector不仅支持基于迭代器的范围for,还可以下标访问。

vector支持下标访问:

          

           


访问方法2:

迭代器:

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

虽然vector还是更多喜欢下标访问,但是迭代器可以便于实现范围for和提高接口的通用性。


2.3 push_back和pop_back的使用

我们以一个string为元素的vector来举例(类似于一个二维char数组)

string类型的vector就可以用到匿名对象(第二个push_back)来便于创建:             ​​​

也可以直接传常量字符串来构造:

                             

我们简单来看下push_back的参数。因为对于push_back:

                   

push_back的参数必须是const string& s,因为涉及传常量字符串和单参数构造函数隐式类型转换,需要改小push_back处参数的权限。

   当string作为vector的元素时,就可以对vector的元素进行+=  ,  因为strng是可以+=的。       

pop_back:

     


2.4对于需要深拷贝的传值优化

不过此时遍历的范围for写的有缺陷,因为e是传值传参,所以每个string都需要深拷贝。但是如果底层的拷贝用的是写时拷贝,在效率方面就优化了太多。

但是当我们不知道底层是不是写时拷贝时,就可以用以下的传引用方法,来降低拷贝的成本。                              

for (const auto& e : v1) {
	cout << e << " ";
}

2.5 insert和erase等

在vector中,insert和erase都没有下标版本,只有迭代器版本:

可发现不能传位置了。

而应该写成 :

             

 

再来观察一下两种insert的用法:

另一种则可以控制多少个数据需要被修改成最后的参数:

emplace和insert的作用是几乎一样的,但是效率有点小差距。


2.6 resize

resize不会改变原有空间的数据,而是在多开出的空间输入你的参数。相当于在数组末尾insert。

 

vector的resize不像string那样默认加\0,而是加0:


2.7 sort的使用

        sort是一个函数模版,参数为迭代器。

                       

可以通过v1.begin()+-n来控制从哪开始,或者利用size来只排序前一半:

                  

默认排序是升序,如果希望降序:

sort的第三个参数表示需要传一个可比较的对象(就像qsort需要传一个函数指针一样)

使用仿函数,仿函数是一个对象

greater是在库中实现的,可以选出更大的,相应的还有less:

可以用greater或less比较两个数,输出为0或1。 

                                  

或者也可以利用匿名对象:

                    

     仿函数的具体内容会在后文中讲解,现在知道有这个东西就行了。


3.练习使用vector

136. 只出现一次的数字 - 力扣(LeetCode)

从题目中也可以看出,C++一般都是传vector,而C语言是传int* 和为了能修改而不得不传指针的returnsize:

                       

思路非常简单并且做过无数遍,按位异或即可。

int singleNumber(vector<int>& nums) {
        int ans=0;
        for(auto e:nums){
            ans^=e;
        }
        return ans;
    }

   杨辉三角118. 杨辉三角 - 力扣(LeetCode)

重点理解:resize / operator[]以及vector的包含。

   类似于一个二维数组

将vector<int>作为参数形成一个新的vector。

所以这里会实例化两个类,一个是vector<int>,另一个是vector<vector<int>>,而在杨辉三角中,每一个vector<int>的大小和元素都是不一样,如下图:

      

通过vector实现了动态二维数组,该数组可以直接由运算符重载而直接用两个方括号访问:

                                        

                                  

杨辉三角的解题思路对于现在的大家应该很简单了:

                 

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
           vector<vector<int>> v;
           v.resize(numRows);
           for(int i =0;i<numRows;++i){
            v[i].resize(i+1,0);
            v[i][0]=v[i][i]=1;
           }
           for(int i=0;i<numRows;++i){
               for(int j=0;j<=i;++j){
                if(v[i][j]==0){
                    v[i][j]= v[i-1][j]+ v[i-1][j-1];
                }
               }
           }
           return v;
    }
};

Leetcode传一维数组时需要一个returnsize,为了能改变其值所以传进来的是int* returnsize(正如第一题)

传二维数组时还需要一个数组returncolumnsize来记录每一个一维数组有多少个元素,为了能改变这个一维数组的值只能传int** returncolumnsize.

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

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

相关文章

【Unity自动化游戏框架】通用自动化游戏框架 爽到起飞的工作流 巨幅提升效率 质量 产能

https://github.com/sunsvip/GF_HybridCLRhttps://github.com/sunsvip/GF_HybridCLR 开始GF_HybridCLR自动化通用游戏框架&#xff0c;功能设计和用法的系列博文&#xff1b; GF_HybridCLR通用框架介绍 自动化工作流框架打包/HybridCLR热更流程 万人同屏战斗项目模板 前言: &…

2025年QS世界大学排名,美国大学表现如何?

大多数访问学者申请&#xff0c;在探讨QS大学排名中美国大学的表现时&#xff0c;我们不难发现这些学府在全球高等教育舞台上占据着举足轻重的地位。QS排名作为评估全球大学综合实力的重要指标之一&#xff0c;充分展示了美国大学在学术声誉、科研实力、教学质量和国际影响力等…

57.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;56.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露&#xff08;4&#xff09; 下载网站…

【PowerDesigner】PDM生成建表脚本

目录 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 &#x1f30d;1.2 PowerDesigner使用环境 &#x1f30a;2. PDM生成建表脚本 &#x1f30a;3. 研究心得 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 主要使用PowerDesigne…

2024年制作AI问答机器人给企业带来的几大好处

引言 在当今数字化时代&#xff0c;企业需要不断寻求创新&#xff0c;以提升客户服务水平、降低成本&#xff0c;并改善用户体验。其中&#xff0c;AI问答机器人作为一种智能化解决方案&#xff0c;正在成为越来越多企业的首选。本文将探讨制作AI问答机器人给企业内外部带来的…

北航第四次数据结构与程序设计编程题复习

到期末了&#xff0c;所以再来复习一下以前的作业。 北航第四次数据结构与程序设计编程题 一、栈操作&#xff08;栈-基本题&#xff09;二、C程序括号匹配检查三、计算器&#xff08;表达式计算-后缀表达式实现&#xff0c;结果为浮点&#xff09;四、文本编辑操作模拟&#…

python-找第一个只出现一次的字符

[题目描述] 给定一个只包含小写字母的字符串&#xff0c;请你找到第一个仅出现一次的字符。如果没有&#xff0c;输出 no。输入&#xff1a; 一个字符串&#xff0c;长度小于 1100。输出&#xff1a; 输出第一个仅出现一次的字符&#xff0c;若没有则输出 no。样例输入1 abcabd…

Java进阶_多态特性

生活中的多态 多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作&#xff0c;如图所示&#xff1a; 现实中&#xff0c;比如我们按下 F1 键这个动作&#xff0c;同一个事件发生在不同的对象上会产生不同的结果。…

10.3 Go 同步与通信

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

BUUCTF---web---[SUCTF 2019]CheckIn

1、点击题目连接来到页面 2、上传正常的jpg文件&#xff0c;提示内容不能有<?。本来打算上传图片马&#xff0c;但是有过滤 3、可以改成下面的图片马&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 4、将上面的一句话木马先写成txt再修改后缀为…

idea插件开发之hello idea plugin

写在前面 最近一直想研究下自定义idea插件的内容&#xff0c;这样如果是想要什么插件&#xff0c;但又一时找不到合适的&#xff0c;就可以自己来搞啦&#xff01;这不终于有时间来研究下&#xff0c;但过程可谓是一波三折&#xff0c;再一次切身体验了下万事开头难。那么&…

opencv_GUI

图像入门 import numpy as np import cv2 as cv # 用灰度模式加载图像 img cv.imread(C:/Users/HP/Downloads/basketball.png, 0)# 即使图像路径错误&#xff0c;它也不会抛出任何错误&#xff0c;但是打印 img会给你Nonecv.imshow(image, img) cv.waitKey(5000) # 一个键盘绑…

快递一键查询,只需快递单号,轻松掌握全程物流信息,让您的包裹追踪无忧!

在快节奏的现代生活中&#xff0c;快递已经成为我们生活中不可或缺的一部分。无论是网购的宝贝、亲朋好友寄来的礼物&#xff0c;还是工作中的紧急文件&#xff0c;快递都承载着我们的期待和需要。然而&#xff0c;面对众多的快递公司和复杂的查询流程&#xff0c;如何快速、准…

新火种AI|摊上事儿了!13名OpenAI与谷歌员工联合发声:AI失控可能导致人类灭绝...

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年&#xff0c;OpenAI的CEO Sam Altman就没有清闲过&#xff0c;他似乎一直走在解决麻烦的路上。最近&#xff0c;他的麻烦又来了。 当地时间6月4日&#xff0c;13位来自OpenAI和Google Deep Mind的现任及前任员工联合发布了…

UFS Explorer Professional Recovery: 如何从启用了 mSATA 缓存的 Drobo 设备中恢复数据

天津鸿萌科贸发展有限公司是 UFS Explorer Professional Recovery 数据恢复软件的授权代理商。 UFS Explorer Professional Recovery 数据恢复软件提供综合性的解决方案&#xff0c;用于解决复杂的数据恢复案例&#xff0c;包括那些采用特殊存储技术的案例&#xff0c;或介质受…

“解锁用户留存与复购:链动2+1模式的创新应用与策略“

大家好&#xff0c;我是吴军&#xff0c;担任一家知名软件开发公司的产品经理。 今天&#xff0c;我想和大家分享的是关于如何通过链动21模式来提升用户留存和复购率的策略。 尽管链动模式已经存在一段时间&#xff0c;但许多人认为它已经过时了。实际上&#xff0c;链动模式具…

【Text2SQL 论文】CHESS:利用上下文来合成 SQL 的 pipeline

文章目录 一、论文速读二、CHESS pipeline2.1 Entity and Context Retrieval2.2 Schema Selection2.3 Query Generation 三、预处理四、实验五、总结讨论 一、论文速读 本文提出了一个 pipeline 框架——CHESS——来解决应用于复杂的真实数据库场景下的 Text2SQL 问题。 在现…

vue3的个人理解

本文目的是记录使用vue3的时候的一些属性的个人理解。 一、defineExpose 官方说明 个人理解 在 <script setup>组件中&#xff0c;defineExpose可以暴露出组件的属性。项目实战// dialog组件 <script setup>import { ref } from vueimport { Close } from elemen…

【OCPP】ocpp1.6协议第4.5章节Firmware Status Notification的介绍及翻译

目录 4.5、固件状态通知Firmware Status Notification-概述 Firmware Status Notification 消息 Firmware Status Notification 请求消息 Firmware Status Notification 响应消息 使用场景 举例 FirmwareStatusNotification 请求示例 处理 FirmwareStatusNotification …

RAG与知识库搭建

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…