vector【1】介绍与使用(超详解哦)

news2025/4/15 1:14:13

vector

  • 引言
  • vector介绍
  • 接口使用
    • 默认成员函数
    • 迭代器
    • 容量
    • 元素访问
    • 数据修改
  • 总结

引言

在string部分,我们详细的介绍了各个接口的使用,虽然其不属于STL的一部分,但是接口与STL中的容器相似,所以我们在学习使用vector等STL容器的使用时,就会简单许多:
戳我康string的使用详解哦

vector介绍

vector是可变大小数组序列容器
vector的底层是一块动态申请连续的空间,与数组类似,vector可以通过下标高效的访问数组中的元素;同时由于是动态申请的空间,可以根据需求扩容,弥补了数组大小固定的缺陷;
但是,在进行插入时,vector会根据需要自动扩容,这个过程中需要重新申请一块空间并拷贝数据,会十分影响效率。所以库中的vector会在申请空间时预先多申请一些空间,并以2倍或1.5倍的扩容规则来以减少拷贝行为的发生
vector尾插与尾删的效率非常高,但是其在任意位置插入与删除时,尤其是头插与头删时,就需要挪动数据,效率相对会低很多。所以vector的接口就直接没有支持push_frontpop_front所以vector更适合多次尾插尾删,并且需要经常随机访问其中元素的数据的存储
vector是一个类模板,可以支持存储任意类型的数据:
在这里插入图片描述

接口使用

与string类似,vector也有默认成员函数、迭代器、容量、元素访问、数据修改等接口(使用库vector时需要包含头文件#include<vector>

默认成员函数

构造
构造函数部分重载有,无参构造、n个指定元素构造、迭代器区间构造以及拷贝构造
在这里插入图片描述
由于vector是一个类模板,所以在使用vector来实例化对象是,就需要显式指定模板参数,如vector<int>

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v1; //无参初始化
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int> v2(10, 6);  //使用10个6初始化
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int> v3(v2.begin(), v2.end());  //使用迭代器区间初始化
	for (auto e : v3)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int> v4(v3); //拷贝构造
	for (auto e : v4)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述

析构
析构函数在该对象生命周期结束时由编译器自动调用
在这里插入图片描述
赋值重载
在这里插入图片描述
v2赋值给v1

int main()
{
	vector<int> v1;
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int> v2(10, 6);
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;

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

在这里插入图片描述

迭代器

在这里插入图片描述
vector的迭代器用法与string相同,并且他们的底层都是原生指针。我们可以使用迭代器访问容器中的元素,也可以使用范围for遍历容器中的元素。
begin返回首元素位置的迭代器,end返回尾元素下一个位置的迭代器、rbegin返回尾元素的反向迭代器、rend返回首元素前一个位置的反向迭代器。后面的cbegincendcrbegincrend都是返回其对应的const迭代器,但是前面的函数都有重载const版本。

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	cout << *v1.begin() << endl;
	cout << *(v1.end() - 1) << endl;
	cout << *v1.rbegin() << endl;
	cout << *(v1.rend() - 1) << endl;

	return 0;
}

在这里插入图片描述

容量

在这里插入图片描述
与string类似,size返回容器中元素的个数;resize用于修改容器中元素的个数;capacity返回容器的容量;empty判断容器是否为空;reserve用于修改容器的容量(关于C++11新增的接口先暂时不做介绍):

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << "size:" << v1.size() << " ";
	cout << "capacity:" << v1.capacity() << " ";
	cout << endl;

	v1.reserve(25);//使用reserve修改容量
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << "size:" << v1.size() << " ";
	cout << "capacity:" << v1.capacity() << " ";
	cout << endl;

	v1.resize(3);//使用resize修改数据数量
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << "size:" << v1.size() << " ";
	cout << "capacity:" << v1.capacity() << " ";
	cout << endl;

	v1.resize(10, 6);//使用reserve增大数据数量,并使用6补足
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << "size:" << v1.size() << " ";
	cout << "capacity:" << v1.capacity() << " ";
	cout << endl;
	return 0;
}

在这里插入图片描述

元素访问

在这里插入图片描述
operator[]at都可以通过下标访问对应位置的元素,不同的是:operator[]当传递的下标越界时,就会崩溃并直接终止程序;当at传递的下标越界时,会抛异常,可以被try-catch捕获,而不会导致程序终止
front会返回首元素的引用、back会返回尾元素的引用。

正常访问:

//正常访问时
int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	cout << v1[3] << endl;
	cout << v1.at(3) << endl;
	cout << v1.front() << endl;
	cout << v1.back() << endl;

	return 0;
}

在这里插入图片描述
越界访问:

//越界访问
int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	//at越界访问
	try
	{
		cout << v1.at(6) << endl;
	}
	catch(const exception& e)
	{
		cout << e.what() << endl;
	}
	cout << "访问继续" << endl;
	//operator[]越界访问
	try
	{
		cout << v1[6] << endl;
	}
	catch (const exception& e)
	{
		cout << e.what() << endl;
	}
	cout << "访问继续" << endl;

	return 0;
}

在这里插入图片描述

数据修改

在这里插入图片描述
对于数据修改,与string类似:
push_back用于在序列尾插入一个元素;
pop_back用于在序列尾删除一个元素(由于vector中头插与头删的效率过低,所以不提供接口):

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

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

	return 0;
}

在这里插入图片描述

insert用于在序列中的任一位置(迭代器)插入一个元素、n个指定元素或一段迭代器区间中的元素;
在这里插入图片描述

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int> v2;
	v2.insert(v2.begin(), 6); //相当于头插6
	v2.insert(v2.end(), 7);  //相当于尾插7
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;

	v2.insert(v2.end(), 5, 0);  //尾插5个0
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;

	v2.insert(v2.end(), v1.begin(), v1.end());  //尾插一个v1
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

erase用于在序列的任一位置删除一个元素,或删除一段迭代器区间中的元素;
在这里插入图片描述

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	v1.erase(v1.begin() + 1); //删除第二个元素
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	
	v1.erase(v1.begin() + 1, v1.end() - 1); //删除一个迭代器区间
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	
	return 0;
}

在这里插入图片描述

swap用于交换两个vector中的数据;
clear用于清理vector中的数据(不改变容量):

int main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	v1.push_back(6);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int> v2(6, 6);
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;

	//交换两个vector的数据
	v1.swap(v2);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;

	//清除两个vector中的数据
	v1.clear();
	v2.clear();
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	for (auto e : v2)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

在这里插入图片描述

总结

到此,关于vector的介绍以及接口的使用就介绍完了
STL的容器接口在使用时都有很多相似之处,在后面了解到更多的容器后就会体会到

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

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

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

相关文章

最强自动化测试框架Playwright(7)- 使用cookie避免重复登录

playwright在称为浏览器上下文的隔离环境中执行测试。这种隔离模型提高了可重复性&#xff0c;并防止了级联测试失败。测试可以加载现有的经过身份验证的状态。这消除了在每次测试中进行身份验证的需要&#xff0c;并加快了测试执行速度。 每次测试前登录 以下示例登录到 Git…

工单管理系统有什么优点?工单系统是如何提高企业服务质量和运营效率的?

工单管理系统是一款基于云平台打造的高效报修工单管理系统&#xff0c;为企业报修管理、维保流程优化和后勤决策分析提供全面支持。通过应用工单管理系统&#xff0c;企业能够轻松提升报修效率&#xff0c;降低人工成本&#xff0c;同时提高后勤管理的质量和效益。系统利用先进…

【数据结构•堆】堆排序(理论基础)

堆的定义  • 堆是一个完全二叉树   –所有叶子在同一层或者两个连续层   –最后一层的结点占据尽量左的位置  • 堆性质   –为空, 或者最小元素在根上   –两棵子树也是堆 存储方式  • 最小堆的元素保存在heap[1..hs]内   – 根在heap[1]   –K的左儿子是2k,…

C++语法中bitset位图介绍及模拟实现

一、位图的引入 先来看下边一道面试题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 经过我们之前的学习&#xff0c;我们可能会有以下的思路&#xff1a; 对这些数进行排序&#xff…

Openlayers实战:列表与图层双向信息提示

在Openlayers的实际项目中,经常会在左侧列出信息列表,右边的地图上显示的是对应的图层内容,两边是一一对应的,为了看出来选择的是哪一个,就需要两边互相提示,本示例就很好的展示了这种效果,具体的方法请参考源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhu…

HICP学习--BGP综合小实验

一、实验拓扑 二、实验需求 1、R2-7每台路由器均存在一个环回接口用于建立邻居&#xff0c;同时还存在一个环回来代表连接用户的接口;最终这些连接用户的接口网络需要可以和R1/8的环回通讯 2、AS2网段地址172.16.0.0/16 减路由条目数量 三、实验步骤 首先配置IP R1配置 [r1]…

2023国赛数学建模D题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

拓扑布局和建立小型网络

练习 2.6.1&#xff1a;拓扑布局和建立小型网络 地址表 本实验不包括地址表。 拓扑图 学习目标 正确识别网络中使用的电缆物理连接点对点交换网络验证每个网络的基本连通性 简介&#xff1a; 许多网络问题都可以在网络的物理层解决。因此&#xff0c;必须清楚了解网络连接…

软件测试基础篇——LAMP环境搭建

LAMP 1、Linux系统的其他命令 find命令&#xff1a;在目录下查找文件 ​ 格式一&#xff1a;find 路径 参数 文件名 ​ 路径&#xff1a;如果没有指定路径&#xff0c;默认是在当前目录下 ​ 参数&#xff1a;-name 根据文件名来查找&#xff0c;区分大小写&#xff1b; -…

番外13:使用ADS进行容差分析(蒙特卡洛分析、灵敏度分析、良率分析、良率优化),以带通滤波器设计为例

番外13&#xff1a;使用ADS进行容差分析&#xff08;蒙特卡洛分析、灵敏度分析、良率分析、良率优化&#xff09;&#xff0c;以带通滤波器设计为例 资源下载 https://download.csdn.net/download/weixin_44584198/88210327 技术背景 容差分析是当前电子可靠性设计中最先进…

Docker安装ElasticSearch/ES 7.4.0

目录 前言安装ElasticSearch/ES安装步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 安装步骤2&#xff1a;拉取ElasticSearch镜像1 拉取镜像2 查看已拉取的镜像 安装步骤3&#xff1a;创建容器创建容器方…

nodejs+vue+elementui多媒体素材管理系统

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 多媒体素材管理系统的设计与实现&#xff0c;最主要的是满足使用者的使用需求&#xff0c;并且可以向使用者提供一些与系统配套的服务。…

SpringMVC 的基本概念(一)

1.1 关于三层架构和 MVC 1.1.1 三层架构 我们的开发架构一般都是基于两种形式&#xff0c;一种是 C/S 架构&#xff0c;也就是客户端 / 服务器&#xff0c;另一种是 B/S 架构&#xff0c;也就 是浏览器服务器。在 JavaEE 开发中&#xff0c;几乎全都是基于 B/S 架构…

图像处理技巧形态学滤波之膨胀操作

1. 引言 欢迎回来&#xff0c;我的图像处理爱好者们&#xff01;今天&#xff0c;让我们继续研究图像处理领域中的形态学计算。在本篇中&#xff0c;我们将重点介绍腐蚀操作的反向效果膨胀操作。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 膨胀操作原理 膨胀操作…

C语言 二级指针和多级指针

什么是二级指针&#xff1f; 假设&#xff1a; int a 10;int * p &a;如上&#xff0c;p是指针变量&#xff0c;寄存的是a的地址&#xff0c;指向的是元素a 那么&#xff0c;指针变量p有地址吗&#xff1f;指针变量p的指针指向的是&#xff1f; int * * pp &p; …

《系统架构设计师教程》重点章节思维导图

内容来自《系统架构设计师教程》&#xff0c;筛选系统架构设计师考试中分值重点分布的章节&#xff0c;根据章节的内容整理出相关思维导图。 重点章节 第2章&#xff1a;计算机系统知识第5章&#xff1a;软件工程基础知识第7章&#xff1a;系统架构设计基础知识第8章&#xff1…

数据结构——单链表的实现(c语言版)

前言 单链表作为顺序表的一种&#xff0c;了解并且熟悉它的结构对于我们学习更加复杂的数据结构是有一定意义的。虽然单链表有一定的缺陷&#xff0c;但是单链表也有它存在的价值&#xff0c; 它也是作为其他数据结构的一部分出现的&#xff0c;比如在图&#xff0c;哈希表中。…

JZ32 从上往下打印二叉树(Java)

题目地址&#xff1a;从上往下打印二叉树_牛客题霸_牛客网 题目回顾&#xff1a; 不分行从上往下打印出二叉树的每个节点&#xff0c;同层节点从左至右打印。例如输入{8,6,10,#,#,2,1}&#xff0c;如以下图中的示例二叉树&#xff0c;则依次打印8,6,10,2,1(空节点不打印&…

keil下载程序具体过程2:硬件链路

引言 本篇博客将介绍keil下载程序的过程中&#xff0c;镜像文件将经过哪些硬件&#xff0c;以及简单的介绍他们之间的协议。 一、硬件连接 图1 硬件连接 将PC、jlink、芯片使用ubs线、swd线连接好之后&#xff0c;在PC上的keil软件中&#xff0c;我们选择对应的仿真器&#xf…

滤波器必须掌握的关键知识

一个理想滤波器应该是在通频带内具有均匀且稳定的增益&#xff0c;对信号的其余频带则具有无穷大的衰减。然后&#xff0c;各种实际的频率响应曲线从阻带或从通带到阻带总有一个逐渐过渡的过程&#xff0c;距离理想情况有一定距离&#xff0c;不像其那样跳跃变化&#xff0c;因…