【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.rhkb.cn/news/144283.html

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

相关文章

Java on Azure Tooling 8月更新|以应用程序为中心的视图支持及 Azure 应用服务部署状态改进

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 工具的八月更新。在本次更新中&#xff0c;我们将推出新的以应用程序为中心的视图支持&#xff0c;帮助开发人员在一个项…

Spring修炼之路(1)基础入门

一、简介 1.1Spring概述 Spring框架是一个轻量级的Java开发框架&#xff0c;它提供了一系列底层容器和基础设施&#xff0c;并可以和大量常用的开源框架无缝集成&#xff0c;可以说是开发Java EE应用程序的必备。Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&…

【面试经典 150 | 滑动窗口】串联所有单词的子串

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;两个哈希表方法二&#xff1a;滑动窗口 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一…

JS三大运行时全面对比:Node.js vs Bun vs Deno

全文约 5100 字&#xff0c;预计阅读需要 15 分钟。 JavaScript 运行时是指执行 JavaScript 代码的环境。目前&#xff0c;JavaScript 生态中有三大运行时&#xff1a;Node.js、Bun、Deno。老牌运行时 Node.js 的霸主地位正受到 Deno 和 Bun 的挑战&#xff0c;下面就来看看这…

计算机视觉与深度学习-循环神经网络与注意力机制-RNN(Recurrent Neural Network)、LSTM-【北邮鲁鹏】

目录 举例应用槽填充&#xff08;Slot Filling&#xff09;解决思路方案使用前馈神经网络输入1-of-N encoding(One-hot)&#xff08;独热编码&#xff09; 输出 问题 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;定义如何工作学习目标深度Elm…

Vue中自定义实现类似el-table的表格效果实现行颜色根据数据去变化展示

主要使用div布局实现表格效果&#xff0c;并使用渐变实现行背景渐变的效果 页面布局 <div class"table-wrap"><div class"table-title"><divv-for"(item, index) in tableColumn":key"index":prop"item.prop&qu…

Windows11安装MySQL8.1

安装过程中遇到任何问题均可以参考(这个博客只是单纯升级个版本和简化流程) Windows安装MySQL8教程-CSDN博客 到官网下载mysql8数据库软件 MySQL :: Download MySQL Community Server 下载完后,解压到你需要安装的文件夹 其中的配置文件内容了如下 [mysqld]# 设置3306端口po…

使用applescript自动化trilium的数学公式环境

众所周知&#xff0c;trilium什么都好&#xff0c;就是对数学公式的支持以及markdown格式的导入导出功能太拉了&#xff0c;而最拉的时刻当属把这两个功能结合起来的时候&#xff1a;导入markdown文件之后&#xff0c;原来的数学公式全没了&#xff0c;需要一个一个手动用ctrlm…

python安装第三方模块方法

正常情况下安装python第三方模块没啥说的&#xff0c;但是由于python安装模块默认是在外网下载安装&#xff0c;牵扯外网网速问题&#xff0c;所以可以配置下使用国内某镜像源来下载模块 python -m pip install xxxxxxxxxxx 和 pip install xxxxxxxxxx 的命令都可下载安装第三…

R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类...

原文链接&#xff1a;http://tecdat.cn/?p21379 本文我们对逻辑回归和样条曲线进行介绍&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 logistic回归基于以下假设&#xff1a;给定协变量x&#xff0c;Y具有伯努利分布&#xff0c; 目的是估计参数β。 回想一…

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项

目录 1、求字符串长度函数 1.1、strlen 2、字符串拷贝(cpy)、拼接(cat)、比较(cmp)函数 2.1、长度不受限制的字符串函数 2.1.1、strcpy 2.1.2、strcat 2.1.3、strcmp 2.2、长度受限制的字符串函数 2.2.1、strncpy 2.2.2、strncat 2.2.3、strncmp 3、字符串查找函数…

正态分布的概率密度函数|正态分布检验|Q-Q图

正态分布的概率密度函数&#xff08;Probability Density Function&#xff0c;简称PDF&#xff09;的函数取值是指在给定的正态分布参数&#xff08;均值 μ 和标准差 σ&#xff09;下&#xff0c;对于特定的随机变量取值 x&#xff0c;计算得到的概率密度值 f(x)。这个值表示…

借助 ControlNet 生成艺术二维码 – 基于 Stable Diffusion 的 AI 绘画方案

背景介绍 在过去的数月中&#xff0c;亚马逊云科技已经推出了多篇博文&#xff0c;来介绍如何在亚马逊云科技上部署 Stable Diffusion&#xff0c;或是如何结合 Amazon SageMaker 与 Stable Diffusion 进行模型训练和推理任务。 为了帮助客户快速、安全地在亚马逊云科技上构建、…

快速将iPhone大量照片快速传输到电脑的办法!

很多使用iPhone 的朋友要将照片传到电脑时&#xff0c;第一时间都只想到用iTunes 或iCloud&#xff0c;但这2个工具真的都非常难用&#xff0c;今天小编分享牛学长苹果数据管理工具的照片传输功能&#xff0c;他可以快速的将iPhone照片传输到电脑上&#xff0c;并且支持最新的i…

【Linux】JumpServer 堡垒机远程访问

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

Docker 容器跨主机通信 - Flannel

Author&#xff1a;rab 目录 前言一、架构及环境二、服务部署2.1 Etcd 部署2.2 Flannel 部署2.3 Docker 网络配置 三、容器通信验证及路由分析3.1 通信验证3.2 路由转发分析3.3 数据分发分析 总结 前言 今天是中秋佳节&#xff0c;首先在此祝大家“中秋快乐&#xff0c;阖家团…

RDMA技术(解决主从数据库数据不一致问题)

优质博文&#xff1a;IT-BLOG-CN 一、简介 RDMA(remote direct memory access)即远端直接内存访问&#xff0c;是一种高性能网络通信技术&#xff0c;具有高带宽、低延迟、无CPU消耗等优点。 主要解决网络传输中服务器端数据处理的延迟问题。 Remote&#xff1a;数据通过网络…

机器人过程自动化(RPA)入门 3. 顺序、流程图和控制流程

到目前为止&#xff0c;我们已经了解了RPA是什么&#xff0c;并且我们已经看到了通过记录任务的活动并运行它来训练UiPath机器人是多么简单。使用记录器的UiPath可以很容易地自动化日常任务。在我们开始自动化复杂的任务之前&#xff0c;让我们学习如何控制从一个到另一个的活动…

传统遗产与技术相遇,古彝文的数字化与保护

古彝文是中国彝族的传统文字&#xff0c;具有悠久的历史和文化价值。然而&#xff0c;由于古彝文的形状复杂且没有标准化的字符集&#xff0c;对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术&#xff0c;旨在提高古彝文的自动识别准确性…

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测 目录 分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结…