【C++】vector的介绍 | 常见接口的使用

目录

vector的介绍

常见接口

构造函数

尾插push_back()

vector的遍历

1.用方括号+下标 遍历:

2.调用at()来访问:

3.用迭代器遍历:

4.范围for遍历:

vector空间

vector增删查改

覆盖assign()

查找find()

插入insert()

删除erase()


本篇先对vector做一个介绍,然后把常用的接口演示一下。

由于vector的许多接口和string那儿的高度重合,所以这里就不详讲了,主要做一个了解。只要掌握几个最重要的接口,其余的用到时 查文档就好。

vector的介绍

vector是一个类模板。它能够容纳各种类型的对象作为其元素,并且可以动态地调整大小。可以理解为动态数组

它像数组,又不像。

像数组的是:vector也采用的连续存储空间来存储元素。这意味着可以采用下标对vector的元素进行访问,和数组一样高效。

不像数组的是:它的大小是可以动态改变的,而且它的大小会被容器自动处理。

本质来说,vector使用动态分配数组来存储它的元素。

当新元素插入时候,这个数组需要被重新分配大小,为了增加存储空间。

其做法是,分配一个新的数组,然后将全部元素移到这个数组。

就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。

不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

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

与其它动态序列容器相比(deque、list 、forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。

对于其他不在末尾的删除和插入操作,效率更低。

常见接口

包头文件:

#include<vector>

构造函数

两个标了🚩的要记住:

构造函数声明接口说明
vector();(重点)🚩无参构造
vector(size_type n, const value_type& val = value_type());构造并初始化n个val
vector (const vector& x); 🚩拷贝构造
vector (InputIterator first, InputIterator last);使用迭代器进行初始化构造

我们在使用时,要注意vector是一个类模板,要实例化成 具体的类型 来使用:

vector<int> v1;        //创建一个int类型的,空的v1
​
vector<int> v2(5, 1);  //v2含5个1
​
vector<int> v3(v2);   //拷贝构造
​
vector<int> v4(v3.begin(), v3.end());   //用迭代器

尾插push_back()

vector没有头插 / 头删(因为每次都要挪数据,效率太低),也不能用operator+=,

它只能尾插 / 尾删,或者insert/erase。总之,就是一个一个地插入、删除。

#include<vector>
using namespace std;
​
int main()
{vector<int> v1;      v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);return 0;
}

相关接口:尾删pop_back()

vector的遍历

先说明一下:

vector是不能直接用流插入输出的:

 

因为vector是一个容器,它可以存储多个元素。

而流插入输出操作符<<是用于将一个单独的元素插入到流中的,而不是将整个容器插入到流中。

因此,如果要将vector中的元素输出到流中,需要使用循环逐个输出

现在我们就来看看遍历输出vector的4种方法:

1.用方括号+下标 遍历:

vector是支持operator[]和size()的,因此可以用 方括号+下标 的方式遍历。

#include<iostream>
#include<vector>
using namespace std;
​
int main()
{vector<int> v;      v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);
​for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}return 0;
}

2.调用at()来访问:

 

at()是像函数一样调用的:

for (size_t i = 0; i < v.size(); i++){cout << v.at(i) << " ";}

这里补充一下at()和operator[]的区别:两者检查越界的方式不一样。

at()是较温和的抛异常:

而operator[]是断言:

3.用迭代器遍历:

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

4.范围for遍历:

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

vector空间

容量空间接口说明
size获取数据个数
capacity获取容量大小
empty判断是否为空
resize (重点)改变vector的size
reserve (重点)改变vector的capacity

这些接口的功能、用法都和string里的类似,就不详讲了。

这里要说下,capacity在vs下和在g++下的增长问题:

vs下capacity是按1.5倍增长的,g++是按2倍增长的。

这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。

来测试下:

vs

#include<vector>
#include<iostream>
using namespace std;
​
int main()
{vector<int> v;   int val = v.capacity();for (size_t i = 0; i < 100; i++){v.push_back(i);if (val != v.capacity()){cout <<"now the capacity is:  "<< v.capacity() << endl;}val = v.capacity();}return 0;
}

g++:

vector增删查改

覆盖assign()

assign:将新内容指定给vector,替换其当前内容,并相应地修改其size。也就是说,起到一个替换、覆盖的作用。

演示:

#include<vector>
#include<iostream>
using namespace std;
​
int main()
{vector<int> v;   v.push_back(1);v.push_back(2);v.push_back(3);for (auto& e : v){cout << e << " ";}cout << endl;
​v.assign(8, 8);for (auto& e : v){cout << e << " ";}return 0;
}

查找find()

其实vector的接口里并未提供find(),不光是vector,list、deque等容器中也没有该函数。

这是因为像vector、list、deque等容器,它们都是从头到尾遍历查找,查找逻辑是相同的。

而在算法库<algorithm>中,find()是一个类模板算法,所有的容器都可以复用,想用时直接套上去用,因此没必要单独实现find()接口了。

注意:

1.要包<algorithm>头文件。

2.迭代器区间,都是左闭右开的 :[ first,last )

3.返回的是迭代器。如果找到了val,返回val的迭代器;如果没找到,返回last,即右边开区间的位置。

示例:

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
​
int main()
{vector<int> v;   v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector<int>::iterator it = find(v.begin(), v.end(), 3);cout << *it << endl;return 0;
}

插入insert()

 

有了insert(),我们可以实现自由插入了,包括头插。

现在我们就在2的前面插入一个100:

int main()
{vector<int> v;   v.push_back(1);v.push_back(2);v.push_back(3);vector<int>::iterator pos = find(v.begin(), v.end(), 2);   //先找到2的位置posif (pos != v.end()){vector<int>::iterator it = v.insert(pos, 100);     //在pos位置插入100,2被挤到后一个}for (auto& e : v){cout << e << " ";}return 0;
}

删除erase()

 

示例:

int main()
{vector<int> v;   v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);
​vector<int>::iterator pos = find(v.begin(), v.end(), 2);if (pos != v.end()){v.erase(pos);}for (auto& e : v){cout << e << " ";}return 0;
}

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

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

相关文章

【加载数据--自定义自己的Dataset类】

【加载数据自定义自己的Dataset类】 1 加载数据2 数据转换3 自定义Dataset类4 划分训练集和测试集5 提取一批次数据并绘制样例图 假设有四种天气图片数据全部存放与一个文件夹中&#xff0c;如下图所示&#xff1a; ├─dataset2 │ cloudy1.jpg │ cloudy10.jpg │ …

物联网、工业大数据平台 TDengine 与苍穹地理信息平台完成兼容互认证

当前&#xff0c;在政府、军事、城市规划、自然资源管理等领域&#xff0c;企业对地理信息的需求迅速增加&#xff0c;人们需要更有效地管理和分析地理数据&#xff0c;以进行决策和规划。在此背景下&#xff0c;“GIS 基础平台”应运而生&#xff0c;它通常指的是一个地理信息…

FL Studio21.1电脑试用体验版音乐制作软件

我一直以来对音乐艺术都很感兴趣。最近我接触到了一款名为 FL Studio 的电脑版音乐制作软件&#xff0c;深感其强大功能和广泛适用性。通过使用这款软件&#xff0c;我不仅深入了解了音乐制作的过程与技巧&#xff0c;也加深了对音乐创作的理解。 FL Studio 最初是一款针对 MI…

四川玖璨电子商务有限公司抖音培训引领电商新潮

近年来&#xff0c;随着电子商务的迅猛发展&#xff0c;抖音这个社交媒体平台也逐渐成为了商家必争之地。四川玖璨电子商务有限公司抖音培训&#xff0c;为你解锁电商流量密码&#xff0c;助你一飞冲天&#xff01; 一、抖音电商&#xff1a;下一个电商蓝海 作为拥有海量用户的…

爬虫抓取数据时显示超时,是爬虫IP质量问题?

当我们进行网络爬虫开发时&#xff0c;有时会遇到抓取数据时出现超时的情况。这可能是由于目标网站对频繁请求做了限制&#xff0c;或者是由于网络环境不稳定造成的。其中&#xff0c;爬虫IP的质量也是导致超时的一个重要因素。本文将探讨抓取数据时出现超时的原因&#xff0c;…

前端开发 vs. 后端开发:编程之路的选择

文章目录 前端开发&#xff1a;用户界面的创造者1. HTML/CSS/JavaScript&#xff1a;2. 用户体验设计&#xff1a;3. 响应式设计&#xff1a;4. 前端框架&#xff1a; 后端开发&#xff1a;数据和逻辑的构建者1. 服务器端编程&#xff1a;2. 数据库&#xff1a;3. 安全性&#…

深度学习入门教学——对抗攻击和防御

目录 一、对抗样本 二、对抗攻击 三、对抗防御 一、对抗样本 对抗样本是指对机器学习模型的输入做微小的故意扰动,导致模型输出结果出现错误的样本。深度神经网络在经过大量数据训练后&#xff0c;可以实现非常复杂的功能。在语音识别、图像识别、自然语言处理等任务上被广…

整型提升——(巩固提高——字符截取oneNote笔记详解)

文章目录 前言一、整型提升是什么&#xff1f;二、详细图解1.图解展示 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 整型提升是数据存储的重要题型&#xff0c;也是计算机组成原理的核心知识点。学习c语言进阶的时候,了解内存中数据怎么存&#…

APS手动编译,CLion测试

一、简介 APSI——Asymmetric PSI&#xff1a; 私用集交集&#xff08;PSI&#xff09;是指这样一种功能&#xff0c;即双方都持有一组私用项&#xff0c;可以在不向对方透露任何其他信息的情况下检查他们有哪些共同项。集合大小的上限被假定为公共信息&#xff0c;不受保护。 …

QtCreator报大量未知标识符错误的解决方法

目录 前言背景介绍问题1问题1解决方法问题2问题2 解决方法总结 前言 本文记录了在使用QtCreator开发时遇到的一个错误&#xff0c;导致编译时出现大量的“未知标识符”&#xff0c;经过一番努力最终解决了这个问题&#xff0c;特在此记录。 背景介绍 Qt项目在麒麟V10 系统下…

【DTEmpower案例操作教程】向导式建模

DTEmpower是由天洑软件自主研发的一款通用的智能数据建模软件&#xff0c;致力于帮助工程师及工科专业学生&#xff0c;利用工业领域中的仿真、试验、测量等各类数据进行挖掘分析&#xff0c;建立高质量的数据模型&#xff0c;实现快速设计评估、实时仿真预测、系统参数预警、设…

手机上记录的备忘录内容怎么分享到电脑上查看?

手机已经成为了我们生活中不可或缺的一部分&#xff0c;我们用它来处理琐碎事务&#xff0c;记录生活点滴&#xff0c;手机备忘录就是我们常用的工具之一。但随着工作的需要&#xff0c;我们往往会遇到一个问题&#xff1a;手机上记录的备忘录内容&#xff0c;如何方便地分享到…

微信小游戏从零到上线系列文章整理,建议收藏

引言 本系列是《从零开始开发贪吃蛇小游戏到上线系列》&#xff0c;欢迎大家关注分享收藏订阅。 大家中秋快乐&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。前面笔者给大家讲解了微信小游戏如何从零到上线的流程。可能很多小伙伴都还没有看到。 本…

某高校的毕设

最近通过某个平台接的单子&#xff0c;最后Kali做的测试没有公开可以私聊给教程。 下面是规划与配置 1.vlan方面&#xff1a;推荐一个vlan下的所有主机为一个子网网段 连接电脑和http客户端的接口配置为access接口 交换机与交换机或路由器连接的接口配置为trunk接口---也可以…

阿里云网络、数据中心和服务器技术创新优势说明

阿里云服务器技术创新、网络技术创新、数据中心技术创新和智能运维&#xff1a;云服务器方升架构、自研硬件、自研存储硬件AliFlash和异构计算加速平台&#xff0c;以及全自研网络系统技术创新和数据中心巴拿马电源、液冷技术等技术创新说明&#xff0c;阿里云百科aliyunbaike.…

conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题

上一篇博客《conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败》解决了conan 1.60.0交叉编译boost/1.80.1的问题后&#xff0c;我继续交叉编译openssl/3.1.2时又报错了 conan install openssl/3.1.2 -pr:h aarch64-linux-gnu.…

Linux--进程间通信之命名管道

目录 前言概念命名管道的创建命名管道特性 命名管道通信建立连接资源处理 Client && Server通信总结 前言 上一篇文章介绍匿名管道的进程间通信只适合在具有血缘关系的进程间进行通信&#xff0c;但是如果我们想让两个不相关的进程实现通信&#xff0c;使用匿名管道显…

某企查ymg_ssr列表详情

js篇— 今天来看下某企查的列表详情–侵删 header发现这个参数 先断点一下 然后上一步 就到了这个地方 就开始扣一下这个js 三大段&#xff0c;先不解混淆了&#xff0c; 给a粘贴出来 &#xff0c;去掉自执行 给结果稍微改一下 缺windows&#xff0c;开始补环境 直接上…

Linux常见指令(1)

Linux常见指令[1] 一.前言1.操作系统简述 二.Linux常见指令1.登录Xshell2.Linux下的常见命令1.pwd2.ls1.ls -a2.ls -d3.ls -l 3.cd Linux中的文件系统1.文件的相关知识2.Linux下目录结构的认识1.什么叫做路径?2.Linux的整体目录结构3.为什么要有路径呢?4.绝对路径与相对路径 …

常识判断 --- 科技常识

目录 力与热 光和声 航空成就 垃圾分类 百科知识 血型 二十四节气歌 春雨惊春清谷天 夏满忙夏暑相连 秋处露秋寒霜降 冬雪雪冬小大寒 力与热 光和声 航空成就 垃圾分类 百科知识 血型