【C++】STL---vector基本用法介绍

news2024/12/28 20:40:16

个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍
希望我们一起努力、成长,共同进步。🍓
在这里插入图片描述

vectorC++STL中的一种动态数组容器,用于存储和操作一系列的元素。
同时vector提供了灵活的大小调整、随机访问、连续存储、动态内存管理等特点。

注意使用vector前需要包含头文件#include<vector>
下面将对vector的常用语法作出详细的介绍。

目录

  • 一、vector初始化
    • 1.1一般初始化方式
    • 1.2利用迭代器进行初始化
    • 1.3利用数组指针进行初始化
  • 二、vector的增删查改
    • 2.1增添元素-push_back()
    • 2.2删除元素-erase()
    • 2.3某个位置插入元素-insert()
    • 2.4查找-find()
  • 三、vector迭代器的使用(iterator)
    • 3.1遍历容器元素
  • 四、vector容器的常用算法
    • 4.1排序
  • 五、vector容量操作
    • 5.1reserve
      • 错误案例演示
    • 5.2resize

一、vector初始化

1.1一般初始化方式

例1:创建一个具有5个整型元素的向量

//v1是一个具有5个int类型元素大小的向量
vector<int> v1(5);

例2:创建一个具有5个int类型元素大小的向量,并要将每个元素初始化成0。

//v2是一个具有5个int类型元素大小的向量,其中每个元素都是0
vector<int> v2(5, 0);

在这里插入图片描述

例3:创建5个string类型的向量,并完成初始化操作。

vector<string> v(5, "C++");

在这里插入图片描述

1.2利用迭代器进行初始化

例1:利用相同类型的迭代器进行初始化。

利用相同类型的迭代器进行初始化
vector<int> v1(10, 1);
vector<int> v2(v1.begin(), v1.end());
for (auto e : v2)
{
	cout << e << " ";
}

例2:利用不同类型的迭代器进行初始化。

//利用不同类型的迭代器进行初始化
string str("hello C++");

vector<int> v3(str.begin(), str.end());
vector<char> v4(str.begin(), str.end());

for(auto e : v3)
	cout << e << " ";
cout << endl;
for (auto e : v4)
	cout << e << " ";
cout << endl;

在这里插入图片描述

1.3利用数组指针进行初始化

//利用数组指针进行初始化
int a[] = { 1,2,3,4 };
vector<int> v5(a, a + 4);

在这里插入图片描述

二、vector的增删查改

2.1增添元素-push_back()

方法1:使用成员函数push_back()

vector<int> v3;
	v3.push_back(1);
	v3.push_back(2);
	v3.push_back(3);
	v3.push_back(4);

在这里插入图片描述
方法2:使用for循环进行赋值

vector<int> v4;
for (int i = 0; i < 10; i++)
	v4.push_back(i);

在这里插入图片描述

2.2删除元素-erase()

int a[] = { 1,3,5,7,9 };
vector<int> v(a, a + 5);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//删除第一个位置的值
v.erase(v.begin());
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

//删除第三个位置的值
v.erase(v.begin()+2);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

在这里插入图片描述

2.3某个位置插入元素-insert()

在这里插入图片描述

int a[] = { 1,3,5,7,9 };
vector<int> v(a, a + 5);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

v.insert(v.begin(), 100);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

在这里插入图片描述

2.4查找-find()

这里需要注意的是:

虽然vector容器本身没有直接提供查找函数即find的成员函数,但通过包含<algorithm>头文件,你可以使用find算法函数来在vector中查找元素。这是因为标准库提供了一种通用的查找函数,可以在各种容器中使用。

举个例子:

//查找元素
int a[] = { 0,2,4,6,8,10,12 };
vector<int> v(a, a + sizeof(a) / sizeof(a[0]));
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

vector<int>::iterator pos = find(v.begin(), v.end(), 8);
if (pos != v.end())
	v.erase(pos);
for (auto e : v)
{
	cout << e << " ";
}
cout << endl;

在这里插入图片描述

三、vector迭代器的使用(iterator)

3.1遍历容器元素

vector<int> v5;
	v5.push_back(1);
	v5.push_back(2);
	v5.push_back(3);
	vector<int>::iterator it = v5.begin();
	while (it != v5.end())
	{
		cout << *it << " ";
		it++;
	}

在这里插入图片描述

四、vector容器的常用算法

我们知道,容器可以用来存储数据,而算法就是对数据进行处理。通过容器也能能够访问其中存储的数据,所以我们可以通过容器来实现一些常用的算法。例如一些查找的算法、排序的算法。

4.1排序

例1:升序。

//升序
int a[] = { 15,9,29,3,50 };
vector<int> v(a, a + 5);
sort(v.begin(), v.end());
//sort(v.rbegin(), v.rend());使用反向迭代器,此时为降序
for (auto e : v)
	cout << e << " ";
cout << endl;

例2:降序。

greater<int> g;
sort(v.begin(), v.end(), g);
//sort(v.rbegin(), v.rend());使用反向迭代器,此时为升序
for (auto e : v)
	cout << e << " ";
cout << endl; 

降序这里我们其实没有必要传greater<int> g这个有名对象,这里完全可以用匿名对象来实现。
sort(v.begin(), v.end(), greater<int>());

在这里插入图片描述

例3:对string类型的对象进行排序。

string str("hello world");
sort(str.begin(), str.end());
cout << str << endl;

在这里插入图片描述

五、vector容量操作

5.1reserve

reserve函数用于预留一定的容量空间,以提高向vector中添加元素的效率。它通常在你知道vector将存储大量元素时使用,可以避免不必要的重新分配和复制元素。

这里有一点非常重要调用reserve函数不会改变vector的大小(即size()的返回值),只会影响vector的容量(即capacity()的返回值)。

错误案例演示

下面举一个错误案例

//这是一个错误案例
vector<int> v1;
v1.reserve(10);
for (size_t i = 0; i < 10; i++)
{
	v1[i] = i;
}

v1[i] = i中的[]操作会先对size进行检查,即assert(i < _size);。而上述代码中的size是0,执行完v1.reserve(10);之后只是改变了capacity,并不会对size进行改变。经过assert(i < _size);的检查之后当然会报错了。

但是如果我们依然要使用reserve的话,我们应该这样去使用,请看:

vector<int> v;
v.reserve(10);
for (size_t i = 0; i < 10; i++)
{
	v.push_back(i);
	cout << v[i];
}

在这里插入图片描述

5.2resize

resize函数用于改变vector的大小(即改变size),可以增加或减少元素的数量。当增加大小时,新的元素会使用默认值进行初始化。

调用vector的resize函数会同时改变size和capacity

vector<int> v1;
v1.resize(10);
for (size_t i = 0; i < 10; i++)
{
	v1[i] = i;
}

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

在这里插入图片描述
在这里插入图片描述

关于reserve函数和resize函数要时刻注意sizecapacity的变化。开辟了空间(capacity)后不一定可以对其内容进行访问,因为有时可能会对size的大小进行检查,比如[]

好了,以上就是本文的全部内容,主要对vector的一些基本语法和用法进行了介绍。
就到这里吧,再见啦友友们!!!

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

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

相关文章

异步任务——CompletabelFuture

本专栏学习内容又是来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 在学习CompletableFuture之前&#xff0c;必须要先了解一下Future Future 概念 Future接口&#xff08;FutureTask实现类&#xff09;定义了操作异步任务执行的一些方法&#xff0c;如获取异…

编写测试用例的方法,这个是真的很好用

大家测试过程中经常用的等价类划分、边界值分析、场景法等&#xff0c;并不能覆盖所有的需求&#xff0c;我们之前讲过很少用到的因果图法&#xff0c;下面就来讲另一种不经常用到但又非常重要的测试用例编写方法——测试大纲法。 测试大纲法适用于有多个窗口&#xff0c;每个…

Mysql下载详细步骤

一、下载mysql 打开地址&#xff1a;MySQL :: Download MySQL Community Server 这里我下载的是红框标注的。 直接点击No thanks,just start my download.解压后文件看自己需求放置。 红框圈住的文件都是后面自己添加的。 my文件中需要添加的文本内容。 [mysqld] #设置3306端口…

【conan】本地编译三方库,上传conan服务器

1.6 conan 远程已经编译好的库 conan中文博客&#xff1a; 三方库资源&#xff1a; github conan-io 本地查询 conan search Existing package recipes:b2/4.9.6 boost/1.71.0nolovr/stable bzip2/1.0.8 ceres-solver/2.0.0nolovr/stable eigen/3.3.7nolovr/stable eigen_c…

pdf转换成word怎么转换?简单快捷方法分享

pdf转换成word怎么转换&#xff1f;需要将PDF文档转换为Word文档&#xff0c;以便更好地编辑和修改文本内容。比如&#xff0c;当你需要对一份PDF文档中的内容进行修改、编辑或者格式化时&#xff0c;你可以先将其转换为Word文档&#xff0c;再进行修改。这样可以更快速、更便捷…

【数据结构与算法】哈夫曼编码(最优二叉树实现

哈夫曼编码 等长编码&#xff1a;占的位置一样 变长编码&#xff08;不等长编码&#xff09;&#xff1a;经常使用的编码比较短&#xff0c;不常用的比较短 最优&#xff1a;总长度最短 最优的要求&#xff1a;占用空间尽可能短&#xff0c;不占用多余空间&#xff0c;且不…

4.BIO多线程即时通信

highlight: arduino-light 基于BIO模式下的即时通信&#xff0c;我们需要解决客户端到客户端的通信&#xff0c;也就是需要实现客户端与客户端的端口消息转发逻辑。 功能清单 1.客户端登陆功能 可以启动客户端进行登录&#xff0c;客户端登陆只需要输入用户名和服务端ip地址即可…

JVM理论(五)执行引擎--解释器/JIT编译器

概述 首先执行引擎是java虚拟机核心的组成部分之一;而JVM的主要任务是装载字节码到内存,但不能够直接运行在操作系统之上.因为字节码指令并非等价于本地机器指令,它仅仅包含能够被JVM所识别的指令、符号表、以及其他信息;而此时执行引擎就华丽登场,它的任务就是将字节码指令解…

欧姆龙PLC联网

一、设备信息确认 左上角的为PLC型号,如图该PLC型号为CP1H,不同型号的欧姆龙PLC通讯方面有什么差别呢? 通讯能力和方式不同: 有些型号PLC自带网口,有些则需要扩展(上图中右侧的两个红框内为后扩展的通讯口,扩展模块可以随意组合双网口,双232串口,双485串口都可以)…

D354周赛复盘:特殊元素平方和+数组最大美丽值(滑动窗口)+合法分割最小下标

文章目录 6889.特殊元素平方和思路完整版取模注意&#xff1a;不能对0取余/取模解答错误&#xff1a;本题的数组最后一个下标是nums[nums.size()] 6929.数组的最大美丽值&#xff08;排序滑动窗口&#xff09;思路1&#xff1a;排序滑动窗口注意点 6927. 合法分割的最小下标&am…

My_window类(带有next和quit按钮)

运行代码&#xff1a; //My_window类&#xff08;带有next和quit按钮&#xff09; #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"//--…

为什么项目可见性难以实现?该如何提高?

在项目和专业服务管理中&#xff0c;失败有时难以避免。沟通不足和需求定义不明确被认为是造成失败的最大原因&#xff0c;这意味着项目可见性和信息流动至关重要。 什么是项目可见性&#xff1f; 项目可见性是组织项目相关信息的方式&#xff0c;以便所有团队成员、项目经理…

火狐安卓版支持油猴了!后面将支持更多扩展插件

日前火狐浏览器每夜构建版的安卓版已经带来了更多扩展程序支持&#xff0c;这其中就包括大名鼎鼎的油猴扩展程序。本次火狐浏览器每夜构建版更新新增五款扩展程序支持&#xff0c;并且按照谋智基金会说法还会支持更多的扩展程序。 下载地址&#xff1a;https://ftp.mozilla.org…

力扣 406. 根据身高重建队列

题目来源&#xff1a;https://leetcode.cn/problems/queue-reconstruction-by-height/description/ C题解1&#xff1a;分别对h和k两个维度进行考虑&#xff0c;我这里是优先考虑k值&#xff0c;k值相同的时候h小的排前面。然后再一一遍历&#xff0c;对于people[i]&#xff0c…

曲师大2023大一新生排位赛-D.Factor题解

D.Factor 题目描述 你有一个集合 &#xff0c;和具有 个正整数的数组 . 最初&#xff0c;集合 为空&#xff08;不包含任一元素&#xff09;。你将按照以下方式填充集合 : 以此枚举数组 a 中的每个元素。对于数组中的第 i 个元素 &#xff0c;生成 ​ 的因子集合 ​。如果…

uniapp引入echarts

作为前端在开发需求的时候经常会遇到将数据展示为图表的需求&#xff0c;之前一直用的HBuilder的图表插件uCharts&#xff0c;使用方法可以参考我的另一篇博客&#xff1a;uniapp 中使用图表&#xff08;秋云uCharts图表组件&#xff09; 但是最近发现uCharts很多功能都需要付…

国密算法概述、及算法的集成应用(sm2、sm3、sm4)

国密算法概述、及算法的集成应用&#xff08;sm2、sm3、sm4&#xff09; 一、概述二、分类概述3.1、SM1对称密码3.2、SM2椭圆曲线公钥密码算法3.3、SM3杂凑算法3.4、SM4对称算法3.5、SM7对称密码3.6、SM9标识密码算法3.7、ZUC祖冲之算法 三、集成SM2加解密四、集成SM3加密、验签…

系统学习Linux-Rsync远程数据同步服务(三)

一、概述 rsync是linux 下一个远程数据同步工具 他可通过LAN/WAN快速同步多台主机间的文件和目录&#xff0c;并适当利用rsync 算法减少数据的传输 会对比两个文件的不同部分&#xff0c;传输差异部分&#xff0c;因此传输速度相当快 rsync可拷贝、显示目录属性&#xff0c…

将TXT转化为PDF的方法有哪些,分享四个给大家!

将TXT文本文件转换为PDF是一项常见的需求&#xff0c;特别是在需要共享文档时。在本文中&#xff0c;我们将分享四种方法&#xff0c;让您能够轻松地将TXT文件转换为PDF格式。 方法一&#xff1a;使用记灵在线工具 记灵在线工具是一个方便易用的在线文档转换工具&#xff0c;…

日撸java三百行day77-79

文章目录 说明GUI1. GUI 总体布局2. GUI 代码理解2.1 对话框相关控件2.1.1 ApplicationShowdown.java&#xff08;关闭应用程序&#xff09;2.1.2 DialogCloser.java&#xff08;关闭对话框&#xff09;2.1.3 ErrorDialog.java&#xff08;显示错误信息&#xff09;2.1.4 HelpD…