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

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的容器接口在使用时都有很多相似之处,在后面了解到更多的容器后就会体会到

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

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

希望与大家共同进步哦

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript之BOM+window对象+定时器+location,navigator,history对象

一.BOM概述 BOM即浏览器对象模型,它提供了独立于内容而与窗口进行交互的对象 BOM的顶级对象是window 二.window对象的常见事件 1.窗口加载事件window.onload window.onload function(){} 或者 window.addEventListener("onload" , function(){}); window.onlo…

websocket知识点

http协议 http协议特点&#xff1a; 无状态协议每个请求是独立的单双工通信&#xff0c;且服务器无法主动给客户端发信息http协议受浏览器同源策略影响 http实现双向通信方法: 轮询长轮询iframe流sse EventSource websocket协议 websocket协议: 全双工协议支持跨域支持多…

近地面无人机植被定量遥感与生理参数反演技术

遥感&#xff08;RS-Remote Sensing&#xff09;——不接触物体本身&#xff0c;用传感器收集目标物的电磁波信息&#xff0c;经处理、分析后&#xff0c;识别目标物&#xff0c;揭示其几何、物理性质和相互关系及其变化规律的现代科学技术。 换言之&#xff0c;即是“遥远的感…

【Ubuntu】简化反向代理和个性化标签页体验

本文将介绍如何使用Docker部署Nginx Proxy Manager和OneNav&#xff0c;两个功能强大且易用的工具。Nginx Proxy Manager用于简化和管理Nginx反向代理服务器的配置&#xff0c;而OneNav则提供个性化的新标签页体验和导航功能。通过本文的指导&#xff0c;您将学习如何安装和配置…

SQL-每日一题【1517. 查找拥有有效邮箱的用户】

题目 表: Users 编写一个解决方案&#xff0c;以查找具有有效电子邮件的用户。 一个有效的电子邮件具有前缀名称和域&#xff0c;其中&#xff1a; 前缀 名称是一个字符串&#xff0c;可以包含字母&#xff08;大写或小写&#xff09;&#xff0c;数字&#xff0c;下划线 _ &…

[保研/考研机试] KY163 素数判定 哈尔滨工业大学复试上机题 C++实现

题目链接&#xff1a; 素数判定https://www.nowcoder.com/share/jump/437195121691718831561 描述 给定一个数n&#xff0c;要求判断其是否为素数&#xff08;0,1&#xff0c;负数都是非素数&#xff09;。 输入描述&#xff1a; 测试数据有多组&#xff0c;每组输入一个数…

Vue3入门

1. 为什么要学 Vue3 &#xff1f; Vue3 的优势&#xff1a; Vue2 选项式 API vs Vue3 组合式API 2. create-vue搭建Vue3项目 2.1 认识 create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了 vite&#xff08;下一代构建工具&#xff09;&#xff0c;为开发…

【Vue3】keep-alive 缓存组件

当在 Vue.js 中使用 <keep-alive> 组件时&#xff0c;它将会缓存动态组件&#xff0c;而不是每次渲染都销毁和重新创建它们。这对于需要在组件间快速切换并且保持组件状态的情况非常有用。 <keep-alive> 只能包含&#xff08;或者说只能渲染&#xff09;一个子组件…

SQL-每日一题【1484. 按日期分组销售产品】

题目 表 Activities&#xff1a; 编写解决方案找出每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。 结果表结果格式如下例所示。 示例 1: 解题思路 前置知识 group_concat函数的功能   将group by产生的…

Linux 基础篇(六)sudo和添加信任用户

一、sudo 1.是什么&#xff1f; 给被信任的普通用户授权&#xff0c;让被信任的普通用户能执行root用户才能执行的命令的一个命令。 2.为什么&#xff1f; 很多时候我们要在被信任的普通用户下执行一些root用户才能执行的命令&#xff0c;如 yum… 所以需要有一个命令能给普通用…

C字符串与C++ string 类:用法万字详解(上)

目录 引言 一、C语言字符串 1.1 创建 C 字符串 1.2 字符串长度 1.3 字符串拼接 1.4 比较字符串 1.5 复制字符串 二、C字符串string类 2.1 解释 2.2 string构造函数 2.2.1 string() 默认构造函数 2.2.2 string(const char* s) 从 C 风格字符串构造 2.2.3 string(co…

【计算机网络】——数据链路层

二、组帧 1、字符计数法 帧头部使用一个字符来表示帧的大小(包括第一个计数字符) &#xff08;此处一字符一个字节&#xff09; 2、字符填充收尾定界法 特定字符来定界帧的首和尾。若帧中数据段出现等同于特定字符的字符内容&#xff0c;前置一个转义字符。(类似于正则表达…

块、行内块水平垂直居中

1.定位实现水平垂直居中 <div class"outer"><div class"test inner1">定位实现水平垂直居中</div></div><style>.outer {width: 300px;height: 300px;border: 1px solid gray;margin: 100px auto 0;position: relative;}.te…

特征选择 | 变量重要性衡量

特征选择 | 变量重要性衡量 目录 特征选择 | 变量重要性衡量写在前面常规方法存在问题解决策略参考资料 写在前面 特征选择是预测模型构建的关键步骤&#xff0c;旨在1&#xff09;降低数据维度&#xff0c;减少计算量&#xff1b;2&#xff09;剔除一些无关或冗余变量&#xf…

科大讯飞分类算法挑战赛2023的一些经验总结

引言: ResNet是he kaiming大佬的早年神作&#xff0c;当年直接刷榜各大图像分类任务。ResNet是一种残差网络&#xff0c;咱们可以把它理解为一个子网络&#xff0c;这个子网络经过堆叠可以构成一个很深的网络&#xff0c;而ResNext在其基础上&#xff0c;进行了一定修改完善&am…

七、解析应用程序——枚举内容与功能

文章目录 1、web抓取2、发现隐藏内容2.1 蛮力技巧2.2 通过公布的内容进行推测2.3 利用公共信息 3、应用程序页面和功能路径4、发现隐藏参数 攻击应用程序的第一步是收集和分析与其有关的一些关键信息&#xff0c;以清楚了解攻击目标。解析过程首先是枚举应用程序的内容与功能&a…

QT学习笔记-QT安装oracle oci驱动

QT学习笔记-QT安装oracle oci驱动 0、背景1、环境以及条件说明2、编译驱动2.1 下载oracle instant client2.2 编译qt oci驱动2.2.1 修改oci.pro2.2.2 MinGW64构建套件编译2.2.3 MSVC2019_64构建套件编译 3、访问数据库运行成功 0、背景 在使用QT开发应用的过程中&#xff0c;往…

分布式搜索ElasticSearch-ES(一)

一、ElasticSearch介绍 ES是一款非常强大的开源搜索引擎&#xff0c;可以帮我们从海量的数据中快速找到我们需要的内容。 ElasticSearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack(ELK)&#xff0c;被广泛运用在日志数据分析&#xff0c;实时监控等领域。 …

国产航顺HK32F030M: 内部参考电压

HK32F030MF4P6 用户手册 内部参考电压 adc.c #include "bsp_adc.h"/*** brief ADC GPIO 初始化* param 无* retval 无*/ static void ADCx_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;// 打开 ADC IO端口时钟ADC_GPIO_AHBxClock_FUN ( ADC_GPIO_C…

MySQL~事务的四大特性和隔离级别

事务的四大特性 1.原子性&#xff1a;一个事务&#xff08;transaction&#xff09;中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部不完成。事务在执行过程中发生错误&#xff0c;会被回滚&#xff08;Rollback&#xff09;到事务开始前的状态&#xff0c;就像这个…