第九层(3):STL之vector类

news2024/10/7 0:11:20

文章目录

  • 前情回顾
  • vrctor类
    • vrctor类的功能
    • vector与普通数组的区别
    • vector的迭代器
    • vector类内的构造函数
    • vector类内的赋值操作
    • vector类内对容器和大小操作
    • vector类内的插入操作
    • vector类内的删除操作
    • vector类内的单个访问
    • vector类内的交换函数
    • vector类内的预留空间
  • 下一座石碑

🎉welcome🎉
✒️博主介绍:一名大一的智能制造专业学生,在学习C/C++的路上会越走越远,后面不定期更新有关C/C++语法,数据结构,算法,Linux,ue5使用,制作游戏的心得,和大家一起共同成长。
✈️C++专栏:C++爬塔日记
😘博客制作不易,👍点赞+⭐收藏+➕关注

前情回顾

上章中,我掌握了string类的使用,第二个石碑也倒下,但是后面还是一座石碑…

  • 🚄上章地址:第九层(2):STL之string类

vrctor类

“看来后面还会有很多石碑,我明白那个人为什么说东西很多了,这一层的石碑比前面八层合起来石碑应该还要多…"

vrctor类的功能

  • vector的数据结构和数组非常相似,被称为单端数组

vector与普通数组的区别

  • 普通数组申请的是静态空间,而vector的空间可以动态扩展1

vector的迭代器

  • vector的迭代器是支持随机访问的迭代器
    在这里插入图片描述

vector类内的构造函数

  • vector类内的构造函数可以用于创建一个vector的容器,也可以对其进行初始化的操作
vector<T> v;//采用模板实现,默认构造函数
vector(v.begin(),v.end());//将v.begin()到v.end()之间的元素拷贝给本身
vector(int n , T elem);//将n个elem拷贝给本身
vector(const vector &v);//将v的数据拷贝给本身

使用:

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

void print(vector<int>& v)
{
	for (vector<int>::iterator b=v.begin(); b < v.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	print(v);
	vector<int> v1(v.begin(), v.end());
	print(v1);
	vector<int> v2(10, 0);
	print(v2);
	vector<int> v3(v2);
	print(v3);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

vector类内的赋值操作

  • vector类内的赋值,其实相当于拷贝的操作,类内提供了三种方法:
vector& operator=(const vector &v);//操作符重载,将v的数据拷贝到本身
assign(beg,end);//这里的beg和end是迭代器,这个函数可以将[beg,end)之间的数据拷贝到本身
assign(int n, T elem);//拷贝n个elem到本身
#include<vector>
#include<iostream>
using namespace std;

void print(vector<int>& v)
{
	for (vector<int>::iterator b=v.begin(); b < v.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	vector<int> v(10, 1);
	print(v);
	vector<int> v1 = v;
	print(v1);
	vector<int>v2(v1.begin(), v1.end());
	print(v2);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

vector类内对容器和大小操作

  • vector是一个类似于数组的东西,那它在某一个时间段的大小和容器容量可以去进行计算吗?可以,C++在vector类内封装了一些函数用于操作容器和
    大小
empty();//判断容器是否为空,为空返回真
capacity();//返回容器当前容量
size();//返回容器中的元素个数
resize(int num);//可以重新指定容器的容量,容量为num,若容器变长,则变长的部分全部补0,若变短,则将超出的部分全部删除
reszie(int num,T elem);//可以重新指定容器的容量,容量为num,若容器变长,则变长的部分全部补elem,若变短,则将超出的部分全部删除

使用:

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

void print(vector<int>& v)
{
	for (vector<int>::iterator b=v.begin(); b < v.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	vector<int> v;
	if (v.empty())
	{
		cout << "为空" << endl;
	}
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	print(v);
	cout << v.capacity() << endl;
	cout << v.size() << endl;
	v.resize(15);
	print(v);
	v.resize(20, 1);
	print(v);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

vector类内的插入操作

  • vector类中于string类一样,同样拥有插入函数:
push_back(T ele);//从尾部插入元素ele
insert(const_iterator pos,T ele);//在迭代器pos指向位置插入元素ele
insert(const_iterator pos,int count,T ele);//在迭代器pos指向位置插入count个元素ele

使用:

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

void print(vector<int>& v)
{
	for (vector<int>::iterator b=v.begin(); b < v.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	vector<int> v;
	v.insert(v.begin(), 1);
	print(v);
	v.insert(v.begin(), 9, 2);
	print(v);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

vector类内的删除操作

  • 有插入就有删除:
pop_back();//删除最后一个元素
erase(const_iterator pos);//删除迭代器pos指向的元素
erase(const_iterator start,sonst_iterator end);//删除迭代器start到迭代器end之间的元素
clear();//删除容器中所有数据

使用:

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

void print(vector<int>& v)
{
	for (vector<int>::iterator b=v.begin(); b < v.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	print(v);
	v.pop_back();
	print(v);
	v.erase(v.begin());
	print(v);
	v.erase(v.begin(), v.end());
	print(v);
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	print(v);
	v.clear();
	print(v);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

vector类内的单个访问

  • vector类也可以单个访问,通过下标的方式:
at(int pos);//访问下标为pos的元素
operator[];//操作符重载
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
#include<vector>
#include<iostream>
using namespace std;

void test1()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	cout << v.at(5) << endl;
	cout << v[4] << endl;
	cout << v.front() << endl;
	cout << v.back() << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

vector类内的交换函数

  • 在C当中要交换两个数组的内容,只能通过循环在内部一个一个交换,但是在C++中,有了交换函数,它可以直接交换两个的全部内容:
swap(v);//将v与本身进行交换
#include<vector>
#include<iostream>
using namespace std;

void print(vector<int>& v)
{
	for (vector<int>::iterator b=v.begin(); b < v.end(); b++)
	{
		cout << *b << " ";
	}
	cout << endl;
}
void test1()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	print(v);
	vector<int> v1;
	for (int i = 10; i > 0; i--)
	{
		v1.push_back(i);
	}
	print(v1);
	v.swap(v1);
	print(v);
	print(v1);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

  • swap的实际用途不止于此,现在当一个vector容器先放了10000个元素,然后对其容器进行修改,容器大小会变成多少?
#include<vector>
#include<iostream>
using namespace std;

void test1()
{
	vector<int> v;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
	}
	cout << "调整前" << endl;
	cout << "v的容器大小为" << v.capacity() << endl;
	cout << "v的元素有" << v.size() << endl;
	v.resize(5);
	cout << "调整后" << endl;
	cout << "v的容器大小为" << v.capacity() << endl;
	cout << "v的元素有" << v.size() << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
可以看到容器大小是没有变的,现在只需要五个空间,但是容器的大小为一万多,这个时候就造成了不必要的空间浪费,那这个时候就可以试着将一行

  • vector< int >(v).swap(v);
#include<vector>
#include<iostream>
using namespace std;

void test1()
{
	vector<int> v;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
	}
	cout << "调整前" << endl;
	cout << "v的容器大小为" << v.capacity() << endl;
	cout << "v的元素有" << v.size() << endl;
	v.resize(5);
	vector< int >(v).swap(v);
	cout << "调整后" << endl;
	cout << "v的容器大小为" << v.capacity() << endl;
	cout << "v的元素有" << v.size() << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
那这是为什么?原因在于点前面的内容为一个匿名对象,在创建这个匿名对象的时候,用v对其进行了初始化,这个时候的v是只有五个元素的,所以拷贝过去就只有5个,然后这个匿名对象调用swap函数于v进行交换,这个时候v就只占五个,同时匿名对象在用完之后直接被释放掉,就把大空间释放掉了,同时v也拿到了适合的空间。

vector类内的预留空间

  • 预留空间可以很好的减少vector扩展的次数,同时,预留空间只是预留出来,在没有往里面添加元素的时候,是不可以访问的,那预留空间这么才能减少vector扩展的次数呢?下面用代码演示:
  • 函数原型
reserve(int len);//预留出len个元素长度,不进行初始化,没有元素的时候不可访问

使用:

  • 往一个vector容器中放一万个整型想要多少次开辟?
#include<vector>
#include<iostream>
using namespace std;

void test1()
{
	int count = 0;//统计扩展次数
	int* p = NULL;//进入if的条件
	vector<int> v;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
		if (p != &v[0])//p不等于首地址的时候进去
		{
			p = &v[0];
			count++;
		}
	}
	cout << count << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
开辟的24次,那如果已经提前知道要10000的空间,选预留出来,会开辟几次?

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

void test1()
{
	int count = 0;//统计扩展次数
	int* p = NULL;//进入if的条件
	vector<int> v;
	v.reserve(10000);
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
		if (p != &v[0])//p不等于首地址的时候进去
		{
			p = &v[0];
			count++;
		}
	}
	cout << count << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
1次,当提前知道要大空间的时候,就可以先预留出来。

下一座石碑

  • 第三座石碑倒下了,“果然后面还有石碑。”更加印证了我的猜想,第九层的石碑可能比前八层加起来还多…

😘预知后事如何,关注新专栏,和我一起征服C++这座巨塔
🚀专栏:C++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉


  1. 不是在原空间之后直接扩展新空间,而是找更大的空间,然后把原有的数据拷贝到新空间,把新空间在释放掉 ↩︎

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

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

相关文章

goto语句——“C”

各位CSDN的uu你们好啊&#xff0c;好久不见&#xff0c;甚是想念。今天小雅兰要带大家学习的内容是一个小知识点——goto语句&#xff0c;好啦&#xff0c;就让我们进入goto语句的世界吧 C语言中提供了可以随意滥用的goto语句和标记跳转的标号。 从理论上 goto语句是没有必要…

Python爬虫教你爬取视频内容

前面介绍了基本的数据爬取&#xff0c;图片爬取的相关案例前面文章也有涉及&#xff0c;关于有些案例网站不能登录的问题&#xff0c;可以再找些别的网站&#xff0c;因为道理既然明白了&#xff0c;其实什么网站都一样&#xff0c;它有反爬机制&#xff0c;自然有应对它的办法…

安装mysql 5.7.24

官网 https://downloads.mysql.com/archives/community/ 安装 安装好后解压有如下内容 配置电脑环境变量 MYSQL_HOME mysql安装目录 PATH %MYSQL_HOME%\bin 配置mysql相关信息 &#xff08;1&#xff09;新建配置文件my.ini 配置的是字符集类信息与存储引擎相关信息 &…

(Java高级教程)第四章必备前端基础知识-第二节2:CSS属性

文章目录一&#xff1a;CSS属性一览表二&#xff1a;常用属性详解&#xff08;1&#xff09;字体属性&#xff08;2&#xff09;文本属性&#xff08;3&#xff09;背景属性一&#xff1a;CSS属性一览表 W3C&#xff1a;元素属性 A&#xff1a; align-content规定弹性容器内…

[Android开发练习1] 绘制国旗

前言 本题主要在于熟练使用线性布局&#xff0c;了解其布局特点学会横向与纵向排列控件&#xff0c;以及认识TextView控件&#xff0c;同时学会使用对控件赋予不同的权重值来布局&#xff0c;在布局中使用了权重的控件的宽度就要设置成0dp。另外&#xff0c;了解到如何应对xml代…

Linux常见命令 25 - RPM包安装、升级、卸载、查询、校验、提取

目录 1. 包名与包全名 2. RPM安装 3. RPM包升级 4. RPM包卸载 5. 查询是否安装RPM包 6. RPM包校验 7. RPM包中文件提取 1. 包名与包全名 包全名&#xff1a;操作的包是没有安装的软件包时&#xff0c;使用包全名&#xff0c;而且要注意路径包名&#xff1a;操作已经安…

【进击的算法】基础算法——怎么优雅地控制边界范围

学习范围 &#xff1a; ✔️数组 ✔️边界控制本文作者 &#xff1a; 蓝色学者i 边界控制的艺术前言一、为什么需要控制边界&#xff1f;二、怎么优雅地控制边界&#xff1f;三、令人抓狂的二分查找3.1 题目概述3.2解题思路3.3 解决方案方案一&#xff1a;边界都有效方案二&…

Python3 循环语句

本章节将为大家介绍 Python 循环语句的使用。 Python 中的循环语句有 for 和 while。 Python 循环语句的控制结构图如下所示&#xff1a; while 循环 Python 中 while 语句的一般形式&#xff1a; while 判断条件(condition)&#xff1a;执行语句(statements)…… 执行流程…

【数据结构之二叉树系列】万字深剖普通二叉树的遍历+分治算法思想

目录前言一、背景知识二、前序遍历三、中序遍历四、后序遍历五、求二叉树中结点的个数1. 遍历计数&#xff08;1&#xff09;前序遍历计数&#xff08;2&#xff09;中序遍历计数&#xff08;3&#xff09;后序遍历计数2.分治算法思想&#xff08;推荐&#xff09;敬请期待前言…

Java基础 IO

IO流 IO流 什么是IO流&#xff1f; 存储和读取数据的解决方案 I&#xff1a;input O&#xff1a;output 流&#xff1a;像水流一样传输数据 IO流的作用&#xff1f; 用于读写数据&#xff08;本地文件&#xff0c;网络&#xff09; IO流按照流向可以分类哪两种流&#xff1f…

数据库02_函数依赖,数据库范式,SQL语句关键字,数据库新技术---软考高级系统架构师009

1.首先我们来看这个,给定一个X,能确定一个Y那么就说,X确定Y,或者Y依赖x,那么 比如y = x * x 就是x确定y,或者y依赖于x 2.然后再来看图,那么左边的部分函数依赖,就是,通过A和B能决定C,那么如果A只用给就能决定C,那么就是部分函数依赖. 3.然后再来看,可以看到,A可以决定B,那么…

servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别

servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别servlet过滤器1.filter过滤器的含义2.filter过滤器的使用3.测试-过滤字符编码正确响应中文编码3.1 创建servlet用于显示中文字符3.2 自定义过滤器3.3 配置web.xml中的servlet映射以及过滤器请求拦截3.4 运行输出…

【编程入门】开源记事本(安卓版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 本系列对比云笔记&#xff0c;将更为简化&#xff0c;去掉了网络调用&#xff0…

第二章 物理层

第二章 物理层 2.1 物理层的基本概念 物理层考虑的是怎样才能在连接各种就算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体 物理层的主要任务描述为确定与传输媒体的接口有关的一些特性 机械特性 指明接口所用接线器的形状和尺寸&#xff0c;引脚数目和排…

辗转相除以及辗转相减法

文章目录前言辗转相除法&#xff08;又名欧几里算法&#xff09;辗转相减法&#xff08;又名更相减损法&#xff09;原始辗转相减法改版辗转相减法&#xff08;减的是指数&#xff09;参考文章前言 在学习Acwing c蓝桥杯辅导课第八讲数论-AcWing 1223. 最大比例时有使用到求指…

使用CNN进行2D路径规划

卷积神经网络(CNN)是解决图像分类、分割、目标检测等任务的流行模型。本文将CNN应用于解决简单的二维路径规划问题。主要使用Python, PyTorch, NumPy和OpenCV。 任务 简单地说&#xff0c;给定一个网格图&#xff0c;二维路径规划就是寻找从给定起点到所需目标位置&#xff0…

如何取消PDF文件的保护设置?

PDF文件可以设置两种保护模式&#xff0c;一种是打开文件保护&#xff0c;也就是设置打开密码&#xff0c;只有输入密码才能打开文件&#xff1b;另一种是限制保护&#xff0c;即限制密码&#xff0c;可以根据需要设置PDF文件是否可以进行编辑、复制、打印等操作。 如果不需要…

第二篇:Haploview做单倍型教程2--分析教程

大家好&#xff0c;我是邓飞&#xff0c;这里介绍一下如何使用Haploview进行单倍型的分析。 计划分为三篇文章&#xff1a; 第一篇&#xff1a;Haploview做单倍型教程1–软件安装第二篇&#xff1a;Haploview做单倍型教程2–分析教程第三篇&#xff1a;Haploview做单倍型教程…

kaggle竞赛 | 计算机视觉 | Doodle Recognition Challenge

目录赛题链接赛题背景数据集探索合并多个类别CSV数据集数据建模 (pytorch)赛题链接 https://www.kaggle.com/competitions/quickdraw-doodle-recognition/overview/evaluation 数据集从上述链接中找 赛题背景 Quick&#xff0c;Draw&#xff01;作为实验性游戏发布&#xff…

python元组

python元组 文章目录python元组一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.创建元组2.访问元组3.修改元组4.删除元组5.索引及截取6.元组运算符7.内置函数总结一、实验目的 掌握元组的用法 二、实验原理 Python 的元组与列表类似&#xff0c;不同之处在…