【c++】vector用法详解

news2024/11/16 1:30:31

vector用法详解

  • vector定义
  • vector容器的构造函数
  • vector容器内元素的访问
    • 1.通过下标 + [ ]来访问
    • 2.通过迭代器来访问
    • 3.通过范围for来访问
  • vector常用函数的用法解析
    • 1.size()
    • 2.clear()
    • 3.capacity()
    • 4.reserve()
    • 5.resize()
    • 6.shrink_to_fit()
    • 7.pop_back()
    • 8.push_back()
    • 9.erase()
    • 10.insert()
      • 补充:算法库中的find()
    • 11.vector iterator适用
      • 1. begin() + end()
      • 2.rbegin() + rend()

铁汁们,今天给大家分享一篇vector用法详解,来吧,开造⛳️

vector定义

💡 vector< typename> name ;

  • vector本质是顺序表,是可以更改大小的"变长数组"。

  • typename为任意类型,例如:int、char、double、string、vector。

💡 Tips:vector是可变大小数组的序列容器。vector使用动态分配数组来存储它的元素,物理空间连续,可以采用下标+[ ]对vector中的元素进行访问。在末尾插入或者删除一个元素时间复杂度为O(1),效率高,而在其他位置处进行插入或者删除一个元素时间复杂度为O(n),效率低,而对于其他物理空间不连续的容器采用迭代器或者引用的方式来访问元素效率高。

vector容器的构造函数

  • 1.构造一个没有元素的空数组a, 元素类型为typename。

💡1. vector a ;

  • 2.构造一个与容器c内元素相同的数组d, 元素类型为typename。

💡2.vector d(const vector& c) ;

  • 3.构造一个与[first, last)范围一样多元素的容器c。

💡3.vector c(iterator first, iterator last ) ;

  • 4.构造一个包含n个元素,每个元素的值为val的数组b, 元素类型为typename。

💡4.vector b(size_t n, const typename& val ) ;

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<string>

using namespace std;

int main()
{
	vector<int> a;
	for (auto it : a)
	{
	    cout << it << ' ';
	}
	    
	vector<int> b(5, 1);
	for (auto it : b)
	{
	    cout << it << ' ';
	}
	cout << endl;
	    
	string s("abcd");
	vector<int> c(s.begin(), s.end());
	//编码表-字符与ASCII值对应的表,内存中实际存储的是字符所对应的ASCII值
	for (auto it : c)
	{
	    cout << it << ' ';
	}
	cout << endl;
	    
	vector<int> d(b);
	for (auto it : d)
	{
	    cout << it << ' ';
	}
	
	return 0;
}

在这里插入图片描述

vector容器内元素的访问

1.通过下标 + [ ]来访问

for (int i = 0; i < v.size(); i++)
 {
    cout << v[i] << ' ';
}
cout << endl;

2.通过迭代器来访问

vector<int>::iterator it = v.begin();
while (it != v.end())
{
	cout << *it << ' ';
	it++;
}
cout << endl;

3.通过范围for来访问

for (auto it : v) //只要该容器支持迭代器,就支持范围for,原因:范围for的底层实现为迭代器
{
	cout << it << ' ';
}
cout << endl;

💡 Tips:只要某个容器支持迭代器,就支持范围for, 原因:范围for的底层实现为迭代器。

vector常用函数的用法解析

1.size()

💡 1.size_t size( )const ;

  • 功能:获得vector中元素的总个数,元素类型为typename。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<string> v1(5, "1111"); //
	cout << v1.size() << endl;
	
	vector<int> v2;
	v2.push_back(1);
	v2.push_back(2);
	v2.push_back(3);
	vector<int> v3(v2.begin() + 1, v2.end());
	cout << v2.size() << endl << v3.size() << endl;
	
	return 0;
}

在这里插入图片描述

2.clear()

💡2.void clear( ) ;

  • 功能:使vector中元素的总个数size变为0,但容量capacity不变。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v(4, 2);
	cout << v.size() << ' ' << v.capacity() << endl;
	v.clear();
	cout << v.size() << ' ' << v.capacity() << endl;
		
	return 0;
}

在这里插入图片描述

3.capacity()

💡3.size_t capacity( )const ;

  • 功能:获得当前分配给vector存储空间的大小。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v; //测试vs下vector默认的扩容机制 -》1.5倍
	size_t sz = v.capacity();
	cout << "start capacity:" << sz << endl;
	for (size_t i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "changed capacity:" << sz << endl;
		}
	}
	
	return 0;
}

在这里插入图片描述

💡 Tips:在vs下capacity呈1.5倍增长的,vs是PJ版本的STL、在g++(linux)下capacity呈2倍增长的,g++是 SGI版本的STL。vector的增容,具体增多少,不能固化,在不同编译器下增容的定义是不同的。

4.reserve()

4.void reserve(size_t n) ;

  • 功能:使得vector容器存储空间的大小为n。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v;
	for (size_t i = 1; i < 15; i++)
		v.push_back(i);
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.reserve(16); //情况一: size < n < capacity ->size不变,capacity不变
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.reserve(22); //情况二: n > capacity  ->size不变,capacity改变,扩容
	cout << v.size() << ' ' << v.capacity() << endl;
	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;
	
	v.reserve(5); //情况三: size > n ->size改变,size不变,capacity不变
	cout << v.size() << ' ' << v.capacity() << endl;
		
	return 0;
}
  • 相当于扩容,不会初始化。

  • 不会改变数据,只会改变容量。当n < size 或 size < n < capacity,在vs下不会缩容,在g++下会缩容。

  • reserve(n),是否会开辟n个空间,取决于编译器,仅仅是向编译器做了个请求工作。

  • 已知需开辟空间的大小为n,可以使用reserve(n),从而减少扩容的次数,提高效率,因为扩容有损耗。

在这里插入图片描述

5.resize()

💡5.void resize(size_t n, const typename& val = typename( ) ) ;

  • 功能:调整vector容器的大小,使其内元素个数变为n。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v;
	for (size_t i = 1; i < 15; i++)
		v.push_back(i);
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.resize(16); //情况一: size < n < capacity ->size改变,capacity不变,插入数据
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.resize(22); //情况二: n > capacity  ->size改变,capacity改变,扩容+插入数据
	cout << v.size() << ' ' << v.capacity() << endl;
	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;
		
		return 0;
	}
	
	v.resize(5); //情况三: size > n ->size改变,capacity不变,删除数据
	cout << v.size() << ' ' << v.capacity() << endl;
		
	return 0;
}

在这里插入图片描述

  • 相当于扩容 + 初始化。
  • 既改变容量,又改变数据。当n < size 或 size < n < capacity,在vs下不会缩容,在g++下会缩容。
  • 情况一: size > n ->size改变,capacity不变,删除数据 ;情况二: size < n < capacity
    ->size改变,capacity不变,插入数据 ; 情况三: n > capacity ->size改变,capacity改变,扩容+插入数据 。
  • 初始化处默认给缺省值,缺省值为无参构造函数,自定义类型会去调它自己的默认构造函数,c++11为了兼容模板,使得内置类型也有构造函数,内置类型得无参构造函数初始化为0eg:int
    val = int(), val = 0、double val = double(),val = 0.0,int* val =
    int*() , val = nullptr、char val = char(), val = ‘\0’。

6.shrink_to_fit()

💡void shrink_to_fit( ) ;

  • 功能:缩容,使capacity()减小到与size()大小相同。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v;
	for (size_t i = 1; i < 15; i++)
		v.push_back(i);
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.resize(5);
	cout << v.size() << ' ' << v.capacity() << endl;
	
	v.shrink_to_fit();
	cout << v.size() << ' ' << v.capacity() << endl;
		
	return 0;
}

在这里插入图片描述

7.pop_back()

💡void pop_back( ) ;

  • 功能:删除最后一个元素。
  • 8.push_back()

💡void push_back( ) ;

  • 功能:在末尾插入一个元素。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);

	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;

	v.pop_back();

	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;
			
	return 0;
}

在这里插入图片描述

9.erase()

💡void erase(iterator position) ;

  • 功能:删除指定位置(迭代器)处的值。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.erase(v.begin() + 1);
	for (auto it : v)
	{
		cout << it << ' ';
	}
	cout << endl;
		
	return 0;
}

在这里插入图片描述

10.insert()

💡void insert(iterator position , const typename& x) ;

  • 功能:在指定的位置(迭代器)前插入元素x。

💡void insert(iterator position , iterator first , iterator end) ;

  • 功能: 在指定位置(迭代器)前插入与范围[first , end)一样多元素的容器

补充:算法库中的find()

💡iterator find(iterator first, iterator end, const typename& x) ;

  • 功能:在范围[first, end)容器中查找与x相同的元素,若查找到了,则返回查找到的元素所在的位置(迭代器),否则返回end(迭代器)。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
	vector<int> v1(5, 2);
	vector<int> v2(3, 6);
	v1.insert(v1.begin() + 2, 3);
	v1.insert(v1.begin(), v2.begin(), v2.end());
	
	for (auto it : v1)
	{
		cout << it << ' ';
	}
	cout << endl;
	
	vector<int>::iterator p = find(v1.begin() + 1, v1.end(), 3);
	if (p != v1.end())
		cout << "查找到了" << endl;
	else
		cout << "查找不到" << endl;
				
	return 0;
}

在这里插入图片描述

  • 头文件为#include。
  • 是函数模板,泛型编程,不是针对于某个容器的迭代器实现的,而是针对于所有容器的迭代器实现的。

11.vector iterator适用

1. begin() + end()

💡iterator begin( )、const_iterator begin( )const

  • 功能:返回第一个元素的位置(迭代器)。

Tips:const_iterator 修饰的是迭代器所指向的元素不能被修改,而迭代器本身可以被修改。const修饰this指针,表示在该成员函数中成员变量不允许被修改,此处const的用法只能用于类中的成员函数。

💡iterator end( )、const_iterator end( )const ;

  • 功能:返回最后一个元素的下一个位置(迭代器)。

2.rbegin() + rend()

💡iterator rbegin( )、const_iterator rbegin( )const ;

  • 功能:返回最后一个元素的位置(迭代器)。

💡iterator rend( )、const_iterator rend( )const ;

  • 功能:返回第一个元素的前一个位置(迭代器)。
    在这里插入图片描述

铁铁们,vector用法详解就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个👍鼓励吧,你们的鼓励就是我的动力✨

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

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

相关文章

TQ15EG开发板教程:使用vivado2023.1建立hello world工程

1:打开软件建立工程 2:使用vivado创建设计模块并生成bit文件 3:导出硬件平台&#xff0c;使用vitis建立工程 4:使用vitis创建应用程序项目 5:硬件设置与调试 1:打开软件建立工程 打开VIVADO2023.1 创建一个新的工程 输入项目名称和地址&#xff0c;下面那个选项为是否…

有关使用Lombok@Builder注解构建对象返回为空

目录 问题 原因 解决方案 问题 使用lombokBuilder注解构建对象返回结果为空 原因 Builder注解底层调用setter等方法赋值&#xff0c;你如果没加Data注解就赋值不上&#xff0c;idea也不会错误警示&#xff0c;运行也不会抛出异常&#xff0c;这个平时不注意漏掉这个点还真…

AI Partition(银灿U盘分区工具)V2.0.0.3

AI Partition(银灿U盘分区工具)V2.0.0.3.zip 复制链接下载吧 https://url20.ctfile.com/f/36743220-1017367709-67f1b9?p2024 (访问密码: 2024) 支持IS903B IS902E IS916 AI Partition(银灿U盘分区量产工具) 这个是银灿官方发布的最新版U盘分区工具&#xff0c;版本号V2.0.0…

开源浏览器Firefox:使用Docker本地部署并远程访问进行测试

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 部署Firefox二. 本地访问Firefox三. Linux安装Cpolar四. 配置Firefox公网地址…

实战打靶集锦-023-oscp

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 探查ssh4.2 探查Apache4.2.1 爆破admin4.2.2 利用secret.txt 5. 提权5.1 枚举主机信息5.2 查看passwd文件5.3 枚举定时任务5.4 枚举可执行文件5.5 查看EXP5.6 Capabilities位5.7 Linpeas提权 靶机地址&#xff1a;ht…

[python]基于LSTR车道线实时检测onnx部署

【框架地址】 https://github.com/liuruijin17/LSTR 【LSTR算法介绍】 LSTR车道线检测算法是一种用于识别和定位车道线的计算机视觉算法。它基于图像处理和机器学习的技术&#xff0c;通过对道路图像进行分析和处理&#xff0c;提取出车道线的位置和方向等信息。 LSTR车道线…

深入理解网络通信和TCP/IP协议

目录 计算机网络是什么&#xff1f; 定义和分类 计算机网络发展简史 计算机网络体系结构 OSI 七层模型 TCP/IP 模型 TCP/IP 协议族 TCP/IP 网络传输中的数据 地址和端口号 MAC地址 IP 地址 端口号 为什么端口号有65535个&#xff1f; 综述 TCP 特性 TCP 三次握…

【Linux】统信服务器操作系统V20 1060a-AMD64 Vmware安装

目录 ​编辑 一、概述 1.1 简介 1.2 产品特性 1.3 镜像下载 二、虚拟机安装 一、概述 1.1 简介 官网&#xff1a;统信软件 – 打造操作系统创新生态 统信服务器操作系统V20是统信操作系统&#xff08;UOS&#xff09;产品家族中面向服务器端运行环境的&#xff0c;是一款…

外贸流程的基本流程图怎么画?这样画简单快速

外贸流程的基本流程图怎么画&#xff1f;随着全球化的不断深入&#xff0c;外贸行业逐渐成为了国家经济发展的重要支柱。对于许多企业和个人来说&#xff0c;掌握外贸基本流程是非常必要的。但是&#xff0c;很多人在初次接触外贸时&#xff0c;对于流程的各个环节并不熟悉&…

c语言--二进制和其他进制之间的转换

目录 一、前言二、二进制、十进制、十六进制、八进制的组成2.1二进制的组成2.2十进制的组成2.3八进制的组成2.4十六进制的组成 三、二进制转换为十进制3.1 二进制转换为十进制3.2十进制转换为二进制 四、二进制转八进制和十六进制4.1二进制转八进制4.2二进制转换为十六进制 五、…

【Iot】什么是串口?什么是串口通信?串口通信(串口通讯)原理,常见的串口通信方式有哪些?

串口通信原理 1. 串口2. 串口通信4. 波特率与比特率5. 帧格式3. 串口通讯的通讯协议3.1. RS2323.2. RS485 总结 1. 串口 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口。 串口可…

浅谈安科瑞消防产品在酒店行业的应用-安科瑞 蒋静

摘要&#xff1a;进入 21 世纪以来&#xff0c;随着网络技术的发展&#xff0c;世界经济呈现全球化趋势&#xff0c;作为消费者衣食住行的重要组成部分&#xff0c;酒店行业也是生活服务市场重要的组成部分。在经济发展的环境下&#xff0c;在旅游业兴起的趋势下&#xff0c;酒…

Multisim14.0仿真(四十七)基于74LS161计数器设计

一、74LS161简介: 74LS161是4位二进制同步计数器,该计数器能同步并行预置数据,具有清零置数、计数和保持功能,具有进位输出端。可串接计数器使用。 二、74LS161引脚定义及说明: CLR:为异步清零控制端。 LOAD:为同步置数控制端 ENP,ENT:为计数控制端 D , C , B , A :为…

如何提高销售线索的质量和数量?这篇文章教会您

提高销售线索质量和数量的方法有&#xff1a;一、优化网站和营销内容&#xff1b;二、利用社交媒体和网络营销&#xff1b;三、提供优质的客户服务和体验&#xff1b;四、定期的市场调研和数据分析&#xff1b;五、建立合作关系和联盟&#xff1b;六、持续学习和创新。通过这些…

多名汇友爆料:在Primemax平台怎么也提不了现!

近期&#xff0c;有多名汇友向我站爆料&#xff0c;称其交易的Primemax平台怎么也出不了金。多名用户在Primemax平台无法出金 据一汇友描述&#xff0c;骗子最初是通过Line加了她好友&#xff0c;聊天中&#xff0c;对方俨然一副阳光帅气的精英人士形象&#xff0c;然后套近乎获…

C++初阶:适合新手的手撕string类(模拟实现string类)

上次讲了常用的接口&#xff1a;C初阶&#xff1a;初识STL、String类接口详细讲解&#xff08;万字解析&#xff09; 今天就来进行模拟实现啦 文章目录 1.基本结构与文件规划2.构造函数&#xff08;constructor)2.1构造函数2.1.1无参有参分开2.1.2利用缺省参数合起来 2.2拷贝构…

Vue 学习随笔系列九 -- 表格中插入图片、背景、自定义表头

表格中插入图片和icon 文章目录 表格中插入图片和icon一、如何插入图片1、代码2、效果 二、文字添加背景1、代码2、效果 三、表头悬浮提示语四、表头添加图标 一、如何插入图片 1、代码 <template><div><el-tablesize"small"borderv-loading"l…

WordPress每天发布60s插件

源码名称:WordPress每天发布60s插件 适用平台:WordPress Wordpress还是比较适合个人博客网站&#xff0c;这个60秒插件适合一些喜欢自动发新闻早报晚报人员 喜欢的赶紧下手。找 万能工具箱合集 小程序即可找到资源

乐鑫与 Elektor 杂志合作推出特刊,聚焦 AIoT 创新

在新一年的起始之际&#xff0c;我们很荣幸地与 Elektor 合作推出由乐鑫领衔编辑的杂志特刊。欢迎点此阅读电子版本。 Elektor 杂志作为国际电子工程和科技创新的重要平台&#xff0c;自 20 世纪 60 年代起&#xff0c;就引领着电子制造的发展潮流。如今&#xff0c;它已经发展…

【Java程序设计】【C00190】基于SSM的餐厅点餐管理系统(论文+PPT)

基于SSM的餐厅点餐管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的餐厅点餐系统 本系统分为前台用户和后台管理员2个功能模块。 前台用户&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是首页界…