【C++】容器vector常用接口详解

news2024/11/16 1:45:41

目录

一.vector基本介绍

二.vector的构造(constructor)

三.vector迭代器(iterator)

四.vector的三种遍历

1.for循环

2.范围for

3.迭代器(正向、反向)

五. vector扩容操作

1.reserve

2.resize

六.vector增删查改

1.push_back和pop_back 

2.find、insert、erase

3.swap


一.vector基本介绍

参照文档:vector - C++ Reference (cplusplus.com)

大致就是:

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

二.vector的构造(constructor)

构造函数功能说明
vector()无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化n个val
vector(const vector& x)拷贝构造
vector(InputIterator first, InputIterator last)使用迭代器进行初始化构造
int main()
{
	vector<int> v1;//无参构造
	vector<int> v2(10, 1);//构造并初始化10个1
	vector<int> v3(v2);//拷贝构造
	
	string s("abcdefg");
	vector<char> v4(s.begin(), s.end());//使用迭代器构造
		
	return 0;
}

三.vector迭代器(iterator)

迭代器功能说明
begin获取第一个数据位置的iterator
end获取最后一个数据的下一个位置的iterator
rbegin获取最后一个数据位置的reverse_iterator(++操作是向前移动)
rend获取第一个数据前一个位置的reverse_iterator

 四.vector的三种遍历

1.for循环

string s1("abcdef");
vector<char> v(s1.begin(), s1.end());//使用迭代器构造

//正常的for循环,利用下标
for (size_t i = 0; i < v.size(); i++)
{
	cout << v[i] << " ";
}

2.范围for

string s1("abcdef");
vector<char> v(s1.begin(), s1.end());//使用迭代器构造

//使用范围for
for (auto e : v)
{
	cout << e << " ";
}

3.迭代器(正向、反向)

string s1("abcdef");
vector<char> v(s1.begin(), s1.end());//使用迭代器构造

//使用正向迭代器,正向遍历
vector<char>::iterator it = v.begin();
while (it != v.end())
{
	cout << *it << " ";
	it++;
}
cout << endl;

//使用反向迭代器,反向遍历
vector<char>::reverse_iterator rit = v.rbegin();
while (rit != v.rend())
{
	cout << *rit << " ";
	rit++;//注意使用的是++而不是--
}
//迭代器++都是向前移动,而反向迭代器的“前”指的就是从后向前

五. vector扩容操作

接口说明
size()获取有效数据个数
capacity()获取容量大小
empty()判断是否为空
resize改变vector的size
reserve改变vector的capacity
  • vector容量的增长取决于环境。例如在vs下capacity是按照1.5倍增长,而g++下是按照2倍增长(vs是PJ版本STL,g++是SGI版本STL)
  • reserve只负责开辟空间,如果确定需要使用多少空间,可以提前reserve以缓解vector扩容时的效率问题
  • resize在开空间时会进行初始化,影响size

1.reserve

reserve函数用于改变容器的容量,这个函数可以用来避免多次重新分配内存的开销,从而提高性能。但需要注意的是,reserve只会用来增加容器的容量,而不会影响容器的size

可以发现,若reserve的数字小于当前容量,vs环境下不会进行缩容,为维持原本的容量大小。

2.resize

resize函数用于改变容器的size大小(即有效数据个数)

  • 若指定参数小于当前size的大小,那么会将多余的元素丢弃
  • 若指定参数大于当前size的大小,那么会将容器size扩大到指定大小,新元素不指明的话将使用默认构造(内置类型初始化为0)

六.vector增删查改

接口说明
push_back尾部插入元素
pop_back尾部删除元素
find查找元素
insert在指定位置插入元素
erase删除指定位置的元素
swap交换两个vector的数据空间
operator[]使用下标访问元素

1.push_back和pop_back 

vector<int> v(5, 0);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;
v.push_back(1);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;
v.pop_back();
for (auto e : v)
{
	cout << e << " ";
}

2.find、insert、erase

find:

  • 形式:iterator find(iterator first , iterator last , const T& val);
  • 参数说明:first和last表示查找范围的起始位置和结束位置的迭代器;val则是要查找的值
  • 作用:在指定范围内查找指定的值,并返回第一个匹配元素的迭代器
  • 注意:该函数在头文件algorithm当中,不是vector类里的,find,swap,sort等都属于该头文件

insert

  •  形式:iterator insert(iterator position , const T& val);
  • 参数说明:position表示插入位置的迭代器;val表示插入的值
  • 作用:在指定位置之前插入一个元素

erase 

  • 形式: iterator erase(iterator positon); 和 iterator erase(iterator first , iterator last);
  • 参数说明:position表示要删除的位置的迭代器;first和last代表要删除的范围的起始位置和结束位置的迭代器
  • 作用:删除指定位置的元素;删除指定范围的元素

结合以上三个函数的例子:

vector<int> v;
//构造一个0,1,2,3,4的vector容器
for (size_t i = 0; i < 5; i++)
{
	v.push_back(i);
}
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//找到其中3的位置,在3之前插入0
//注意:find不在vector类里
vector<int>::iterator it = find(v.begin(),v.end(),3);
v.insert(it, 0);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//将除了最后一个元素都删除
v.erase(v.begin(), v.end() - 1);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

3.swap

  • 形式:void swap(vector& x);
  • 参数说明:x是另外一个vector的引用
  • 作用:交换两个vector的数据空间,使它们的内容互换
vector<int> a(10, 1);
vector<int> b(10, 0);
for (auto e : a)
{
	cout << e << " ";
}
cout << endl;
for (auto e : b)
{
	cout << e << " ";
}
cout << endl << "交换后" << endl;

//进行交换
a.swap(b);
for (auto e : a)
{
	cout << e << " ";
}
cout << endl;
for (auto e : b)
{
	cout << e << " ";
}
cout << endl;

 以上就是vector容器常用的一些接口,下一篇文章就要进行模拟实现了,感谢支持,欢迎持续关注! 

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

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

相关文章

自动化邮件发送:结合SMTP协议使用Python发送包含报表或数据附件的邮件

目录 引言 SMTP协议简介 Python中的smtplib模块 基本使用 发送带附件的邮件 自动化邮件发送系统设计 需求分析 系统架构 实现步骤 1. 准备数据源 2. 创建邮件模板 3. 编写邮件发送引擎 4. 设置调度器 5. 异常处理 示例应用&#xff1a;自动化发送报表邮件 总结…

6种有效的时间序列数据特征工程技术(使用Python)

在商业分析中&#xff0c;"时间"是一个核心概念。我们基于时间组件来分析销售数据、收入、利润、增长&#xff0c;甚至进行预测。然而&#xff0c;对于初学者来说&#xff0c;这可能是一个复杂的主题。在处理时间敏感的数据集时&#xff0c;需要考虑时间序列数据的多…

Vue3其他Api

1.shallowRef与shallowReactive <template><div class"app"><h2>求和为:{{ sum }}</h2><h2>名字为:{{ person.name }}</h2><h2>年龄为:{{ person.age }}</h2><button click"sum 1">sum1</butto…

【Docker系列】Docker 日志管理:批量删除策略与实践

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

剪画:自媒体人都是这么保存无字幕视频素材的!

在数字媒体的精彩世界中&#xff0c;视频如璀璨星辰照亮我们的生活。 无论是教育的启迪、娱乐的放松还是信息的传播&#xff0c;视频都担当着关键角色。 但水印&#xff0c;那以文字或图形形式出现在视频中的印记&#xff0c;虽有声明版权之效&#xff0c;却也常给我们带来困扰…

基于web网上十字绣专营店设计与实现

&#xff08;一&#xff09;业务流程分析 没有实现网上销售的十字绣专营店&#xff0c;即店面销售方式&#xff0c;店面需要专人看管&#xff0c;而且销售范围有限&#xff0c;面向的对象很受限制&#xff0c;销售情况需要店主手工记录到账簿&#xff0c;以备利润汇总&#xf…

脚手架工具的应用(前端和后端搭建)

前端 一、安装 Node.js 环境 使用npm下载镜像 查看镜像&#xff1a;npm config get registry 切换淘宝镜像&#xff1a;npm config set registry https://registry.npmmirror.com 还原镜像&#xff1a;npm config set registry https://registry.npmjs.org 二、使用 Vue.js 脚…

BugKu练习记录:ok

题目&#xff1a; 从特征上看是BrainFuck中的Ook加密&#xff0c;直接用工具解

三天速成数学建模国赛国奖全攻略

这里写目录标题 国赛考点&#x1f5d2;️&#x1f5d2;️01 国赛是如何评奖的&#xff1f;02 国赛历年题型和模型算法1&#xff09;国赛赛题特点2&#xff09;历年国赛赛题类型 建模手三天快速提升计划✨✨01 第一天&#xff1a;模型分类及国赛常见模型的用法了解1&#xff09;…

弹窗相关操作

弹窗使用 文章目录 弹窗使用弹窗-新增表单修改弹窗 弹窗-新增表单 拖拽弹出层组件&#xff0c;补充表单信息 2.点击表单&#xff0c;绑定数据库模型&#xff0c;绑定字段 3.新增弹窗按钮绑定打开或关闭弹出层事件 4.弹窗保存按钮依次绑定 保存表单&#xff0c;打开或关闭弹…

技术风暴中的应急策略:开发团队如何应对突发故障与危机

文章目录 每日一句正能量前言快速响应与问题定位策略建立健全的应急预案和备份机制事后总结与持续改进后记 每日一句正能量 在工作上遇到挫折&#xff0c;于是退缩了&#xff0c;说因为难&#xff1b;在生活上遇到困难难&#xff0c;于是抱怨了&#xff0c;说因为苦&#xff1b…

Docker安装Neo4j图数据库和APOC插件

文章目录 一、前言二、安装Neo4j三、测试Neo4j四、安装APOC插件五、测试APOC插件 一、前言 官方文档&#xff1a;https://neo4j.com/docs/operations-manual/current/docker/introduction/ 二、安装Neo4j 我这里以 5.23.0 版的 Neo4j 为例 拉取镜像 docker pull neo4j:5.23.0…

暴搜、深搜、回溯算法题集

文章目录 1. 全排列2. 全排列II3. 子集4. 子集II5. 找出所有子集的异或总和再求和6. 电话号码的字母组合7. 括号生成8. 组合9. 目标和10. 组合总和11. 组合总和II12. 组合总和III13. 字母大小写全排列14. 优美的排列15. N 皇后16. 有效的数独17. 解数独18. 单词搜索19. 黄金矿工…

Docker 的安全优化

目录 1 Docker安全优化思路 1.1 命名空间隔离的安全 1.2 控制组资源控制的安全 1.3 内核能力机制 1.4 Docker服务端防护 1 Docker安全优化思路 Docker容器的安全性&#xff0c;很大程度上依赖于Linux系统自身 评估Docker的安全性时&#xff0c;主要考虑以下几个方面&#xf…

两步解决yum无法安装软件问题:Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

报错信息&#xff1a; [rootiZwz946ibli8ikuyqgtc58Z ~]# yum install rh-redis5-redis Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org?archx86_64&release7&reposclo-rh …

[vue] jszip html-docx-js file-saver 图片,纯文本 ,打包压缩,下载跨域问题

npm install jszip file-saverimport JSZip from jszip; import FileSaver from file-saver;JSZip 创建JSZip实例&#xff1a; const zip new JSZip();创建文件&#xff1a;支持导出纯文本 zip.file("hello.txt", "Hello World\n");创建文件夹&#xf…

Leetcode3239. 最少翻转次数使二进制矩阵回文 I

Every day a Leetcode 题目来源&#xff1a;3239. 最少翻转次数使二进制矩阵回文 I 解法1&#xff1a;分别统计 先计算所有行变成回文最少需要翻转多少次。 也就是对于每一行 row&#xff0c;计算这一行变成回文最少需要翻转多少次。 也就是累加 row[j]!row[n−1−j] 的个…

Windows 11安装 MinGW-w64 教程

MinGW MinGW&#xff0c;全称“Minimalist GNU for Windows”&#xff0c;是一个提供在Windows操作系统上运行的GNU工具集的软件环境。它允许开发者使用GCC&#xff08;GNU Compiler Collection&#xff09;编译器来编译C和C程序&#xff0c;以及其他GNU工具&#xff0c;如GDB调…

【MySQL】字节跳动MySQL连环40问(网图)

本文首发于 ❄️慕雪的寒舍 字节MySQL连环40问&#xff0c;网图 虽然感觉这玩意和字节跳动没关系&#xff0c;但是管他的&#xff1f;直接开始回答&#xff01; 1.MySQL中有哪几种锁&#xff1f; 会的不全&#xff0c;所以查的GPT MySQL中有多种类型的锁&#xff0c;主要包括以…

【Python篇】Python 类和对象:详细讲解(中篇)

文章目录 Python 类和对象&#xff1a;详细讲解前言9. 方法重写&#xff08;Method Overriding&#xff09;9.1 为什么需要方法重写&#xff1f;9.2 方法重写的基本示例9.3 代码详解 10. 多继承&#xff08;Multiple Inheritance&#xff09;10.1 多继承的概念10.2 多继承的示例…