【C++】vector 基本使用(详解)

目录

一,vector 的介绍

二,vector 的定义

1,vector()

2,vector(size_type n, const value_type& val = value_type())

3,vector (const vector& x)

4,vector (InputIterator first, InputIterator last);

三,vector iterator 的使用

1,begin + end

2,rbegin + rend 

四,vector 空间增长问题

1,size

2,capacity

3,empty

4,reserve

5,resize

五,vector 增删查改

1,push_back

2,pop_back 

3,find

4,insert

5,erase

6,swap

7,operator[]


一,vector 的介绍

1,vector 是表示可变大小数组的序列容器。

2,就像数组一样,vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector 的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

3,本质讲,vector 使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector 并不会每次都重新分配大小。

4,vector 分配空间策略:vector 会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

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

6,与其它动态序列容器相比(deque, list and forward_list), vector 在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起listforward_list 统一的迭代器和引用更好。

二,vector 的定义

1,vector()

无参构造

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1;return 0;
}

这里我们定义一个 vector 类,它里面的各种数据都是初始化了的,不是空就是0;

2,vector(size_type n, const value_type& val = value_type())

构造并初始化 n 个 val

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5, 6);for (int i = 0; i < 5; i++){cout << v1[i]<<" ";}return 0;
}

直接自己定义初始化成 n 个 val;

3,vector (const vector& x)

拷贝构造

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5, 6);vector<int> v2(v1);for (int i = 0; i < 5; i++){cout << v2[i]<<" ";}return 0;
}

拷贝构造嘛,都老朋友了;

4,vector (InputIterator first, InputIterator last);

使用迭代器进行初始化构造

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5,6);for (int i = 0; i < 5; i++){v1[i] = i;}vector<int> v2(v1.begin()+1, v1.end()-1);for (int i = 0; i < 3; i++){cout << v2[i] << " ";}return 0;
}

迭代器进行初始化构造,就是选取一段范围进行拷贝;

三,vector iterator 的使用

1,begin + end

获取第一个数据位置的 iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator

2,rbegin + rend 

获取最后一个数据位置的 reverse_iterator,获取第一个数据前一个位置的 reverse_iterator

诸位爱卿,我相信这张图对汝等足矣!

四,vector 空间增长问题

1,size

获取数据个数

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5, 6);cout << v1.size();return 0;
}

获取有效数据个数,不等同于容量,只是数据个数;

2,capacity

获取容量大小

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5, 6);cout << v1.capacity();return 0;
}

查看空间容量的,不等同于数据个数;

3,empty

判断是否为空,为空返回真,不为空返回 0;

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5, 6);vector<int> v2;cout << v1.empty()<<" "<<v2.empty();return 0;
}

4,reserve

改变 vector 的 capacity

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5, 6);cout << v1.capacity() << endl;v1.reserve(50);cout << v1.capacity() << endl;v1.reserve(20);cout << v1.capacity() << endl;v1.reserve(3);cout << v1.capacity() << endl;return 0;
}

兄弟们自己找找规律; 

5,resize

改变 vector 的 size

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5, 6);cout << v1.size() << " " << v1.capacity() << endl;v1.resize(20);cout << v1.size() << " " << v1.capacity() << endl;v1.resize(10);cout << v1.size() << " " << v1.capacity() << endl;return 0;
}

size()的值与 capacity 的值息息相关的,当 size()大于 capacity 时,capacity 会增大扩容;

五,vector 增删查改

1,push_back

尾插

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5, 6);v1.push_back(7);v1.push_back(8);for (int i = 0; i < v1.size(); i++){cout << v1[i]<<" ";}return 0;
}

2,pop_back 

尾删

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1(5, 6);v1.pop_back();v1.pop_back();for (int i = 0; i < v1.size(); i++){cout << v1[i]<<" ";}return 0;
}

3,find

查找。(注意这个是算法模块实现,不是 vector 的成员接口)

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };auto pos = find(v1.begin(),v1.end(), 3);cout << *pos << endl;pos = find(v1.begin(), v1.end(), 5);cout << *pos;return 0;
}

在一个特点的范围里寻找一个数,然后返回指向这个数的迭代器;

4,insert

在 position 之前插入 val

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };auto pos = find(v1.begin(),v1.end(), 3);cout << *pos << endl;v1.insert(pos, 66);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}return 0;
}

在指定位置前插入特定的数;

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };auto pos = find(v1.begin(),v1.end(), 3);cout << *pos << endl;v1.insert(pos, 3, 77);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;return 0;
}

在指定位置前插入指定数量的数;

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };auto pos = find(v1.begin(),v1.end(), 3);cout << *pos << endl;v1.insert(pos, v1.begin(), v1.begin() + 2);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}return 0;
}

在指定位置前插入一段区间;

5,erase

删除 position 位置的数据

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };auto pos = find(v1.begin(), v1.end(), 3);cout << *pos << endl;v1.erase(pos);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}return 0;
}

删除某个指定位置的数据;

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };v1.erase(v1.begin(),v1.end()-1);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}return 0;
}

删除指定一段区间的数据;

6,swap

交换两个 vector 的数据空间

#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> v1{ 0,1,2,3,4 };vector<int> v2{ 5,6,7,8,9 };v1.swap(v2);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;for (int i = 0; i < v1.size(); i++){cout << v2[i] << " ";}return 0;
}

直接交换两边的数据;

7,operator[]

像数组一样访问

这个我们已经很熟悉了;

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

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

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

相关文章

使用 sourcetree 的《遴选》功能

假设你有一个分支&#xff0c;有两个提交 A&#xff0c;和B&#xff0c;你现在想在A提交的基础上把 B提交的功能做修改&#xff0c;你可以使用 遴选功能。 在A 提交的基础上新建一个分支&#xff0c;然后在B提交上面&#xff0c;右键&#xff0c;选择 遴选&#xff0c;那么B修改…

传感器原理与应用复习--磁电式与霍尔传感器

文章目录 上一篇磁电感应传感器工作原理应用 霍尔传感器工作原理基本特性应用 下一篇 上一篇 传感器原理与应用复习–电容式与压电式传感器 磁电感应传感器 工作原理 导体在稳恒均匀磁场中&#xff0c;沿垂直磁场方向运动时&#xff0c;产生的感应电势为 e B l v e Blv …

Mediapipe绘制实时3d铰接骨架图——Mediapipe实时姿态估计

一、前言 大约两年前&#xff0c;基于自己的理解我曾写了几篇关于Mediapipe的文章&#xff0c;似乎帮助到了一些人。这两年&#xff0c;忙于比赛、实习、毕业、工作和考研。上篇文章已经是一年多前发的了。这段时间收到很多私信和评论&#xff0c;请原谅无法一一回复了。我将尝…

7+WGCNA+机器学习+泛癌生信思路,非肿瘤也能结合泛癌分析

今天给同学们分享一篇生信文章“Analysis and Experimental Validation of Rheumatoid Arthritis Innate Immunity Gene CYFIP2 and Pan-Cancer”&#xff0c;这篇文章发表在Front Immunol期刊上&#xff0c;影响因子为7.3。 结果解读&#xff1a; DEG筛选和数据预处理 数据在…

Baumer工业相机堡盟相机如何使用NEOAPI SDK实现相机的连接(C++)

Baumer工业相机堡盟相机如何使用NEOAPI SDK实现相机的连接&#xff08;C&#xff09; Baumer工业相机Baumer工业相机SDK技术背景代码分析第一步&#xff1a;先使用NEOAPI函数查找相机第二步&#xff1a;连接相机后对相机进行采图第三步&#xff1a;将采集的图像显示在UI界面上 …

BUG-由浏览器缩放引起PC端显示手机端视图

文章目录 来源解决 来源 启动Vue项目&#xff0c;用浏览器打开显示手机端视图&#xff0c;从vscode直接ctrl链接打开正常显示。 检查-未开启仿真&#xff0c;但仍显示错误。 解决 浏览器缩放问题。 修改为100%

【UE5.1】程序化生成Nanite植被

目录 效果 步骤 一、下载Gaea软件和树林资产 二、使用Gaea生成贴图 三、 生成地形 四、生成草地 五、生成树林 六、生成湖泊 七、其它功能介绍 7.1 调整树林生成的面积 7.2 让植物随风飘动 7.3 玩家和植物互动 7.4 雪中树林 7.5 环境音效 效果 步骤 一、下载Ga…

Android 13 默认关闭 快速打开相机

介绍 在设置菜单的手势界面里&#xff0c;快速打开相机是默认开启的&#xff0c;此功能当开启时连续点击两次电源键会打开相机&#xff0c;现在客户需要默认关闭。 效果展示 修改 这里一开始想到的就是配置文件&#xff0c;在路径下果然找到了,从注释中看使我们需要的&#x…

CTF-Crypto练习

技能兴鲁初赛 from gmpy2 import * from Crypto.Util.number import *flag flag{I\m not gonna tell you the FLAG} # 这个肯定不是FLAG了&#xff0c;不要交这个咯p getPrime(2048) q getPrime(2048) m1 bytes_to_long(bytes(flag.encode()))e1 3247473589 e2 3698409…

【验证概括 SV的数据类型_2023.12.18】

验证概括 验证的过程是保证芯片实现符合规格说明书&#xff08;Specification&#xff0c;spec&#xff09;的过程 验证的两项任务&#xff1a; RTL sim&#xff1a;前仿真&#xff0c;验证功能 GLS-Gate (Level Simulation)&#xff1a;后仿真&#xff0c;验证功能和时序 验…

【小白专用】C# 压缩文件 ICSharpCode.SharpZipLib.dll效果:

插件描述&#xff1a; ICSharpCode.SharpZipLib.dll 是一个完全由c#编写的Zip, GZip、Tar 、 BZip2 类库,可以方便地支持这几种格式的压缩解压缩, SharpZipLib 的许可是经过修改的GPL&#xff0c;底线是允许用在不开源商业软件中&#xff0c;意思就是免费使用。具体可访问ICSha…

svg学习

概念 svg 可缩放矢量图形 svg 使用xml格式定义图像 svg 形状 矩形 <rect> <?xml version"1.0" standalone"no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&q…

polar CTF上传

WEB-上传 一、查看题目信息 二、漏洞分析 经过上传测试发现&#xff0c;这题过滤掉了<?&#xff0c;这样正常的一句话木马就没法上传&#xff0c;这里可以用utf-16编码绕过。因为utf-16占utf-8的两倍长度&#xff0c;上传时默认检测为utf-8,从而就能绕过检测成功上传。 同…

Paper Survey——NeRF SLAM

NeRF SLAM&#xff08;Neural Radiance Fields Simultaneous Localization and Mapping&#xff09;是一种结合神经辐射场&#xff08;NeRF&#xff09;和SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;的先进技术&#xff0c;用于实时地构建三维环境地图…

redis 从0到1完整学习 (十一):RedisObject 之 String 类型

文章目录 1. 引言2. redis 源码下载3. redisObject 管理 String 类型的数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;…

ERROR: No matching distribution found for torch==1.12.0+cu113

原因 pip install torch1.12.0cu113用pip安装torch时&#xff0c;出现&#xff1a; ERROR: No matching distribution found for torch1.12.0cu113好像不少用清华源的会出现这个问题 解决办法 pytorch官网&#xff1a;https://pytorch.org/get-started/previous-versions/ …

certum的ip证书购买流程

Certum是成立于欧洲的CA认证机构&#xff0c;经过二十几年的发展Certum已经成为欧洲知名的CA认证机构之一&#xff0c;拥有广泛的客户群体和合作伙伴。IP证书是Certum为只有公网IP地址的网站准备的数字加密服务。今天就随SSL盾小编了解购买Certum旗下的IP证书流程。 第一步&am…

分享72个NodeJs项目源码总有一个是你想要的

分享72个NodeJs项目源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1_bzxbmBlN8ga4-Ci1I0-0w?pwd6666 提取码&#xff1a;6666 项目名称 A lottery webapp …

惟客数据昆仑-开发云成功开源了!让研发更简单高效

​近期&#xff0c;WakeData惟客数据产品——昆仑-开发云成功开源。 今年4月&#xff0c;惟客数据完成了新一轮产品能力升级&#xff0c;与战略伙伴联合研发具有私有化部署能力的行业大模型 WakeMind 。 昆仑-开发云在可视化领域建模的基础上也引入了 WakeMind 的能力&#x…

英文建筑图纸翻译工程图纸翻译

建筑图纸是以图形和文字为语言&#xff0c;详细描绘了工程建筑、机械、设备等结构、形状、尺寸及其他要求。对于建筑图纸翻译&#xff0c;表达必须清楚准确。那么&#xff0c;如何确保英文建筑图纸翻译工程图纸翻译的准确性&#xff1f; 首先&#xff0c;我们需要深入了解建筑图…