C++学习——vector类的使用

news2024/11/27 2:34:18

目录

vector类的介绍:

vector类的构造函数:

  operator=

  operator [ ] 

  begin & end

  size & resize

  capacity & reserve

  push_back & pop_back

  insert & erase

vector类的介绍:

  vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

  实质上vector的作用等同于数据结构当中的顺序表。因为vector是使用模板实现的,所以我们可以通过传入指定的参数,进行存储各种类型的数据。

vector类的构造函数:

  和我们平时定义的类一样,vector同样有很多构造函数,用于创建我们的顺序表。构造函数如下:

  其中有一个参数大家可能会很陌生:const allocator_type& alloc = allocator_type(),该参数表示的是使用默认的内存分配器为系统默认的分配器。我们可以将其忽略,直接将第一个参数为空参数。即创建一个顺序表,但是顺序表当中的数据为空。

  第二个构造函数作用是开辟n个数据的空间,空间的类型默认情况下和我们前面定义好的类型相同。

  第三个构造函数时使用一个迭代器创建一个顺序表。我们甚至可以创建一个数组,传入数组的指针作为实例化的参数,进行创建vector的对象。

  最后一个是vector类的构造函数,我们可以使用一个创建好的vector对象进而创建一个一模一样的vector对象。测试代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	//调用第一个默认参数为空的构造函数
	vector<int> test1;

	//调用第二个构造函数,为其分配四个空间
	vector<int> test2(4);

	//使用指针初识一个vector对象
	int arr[] = {1,2,3,4,5,6};
	vector<int> test3(arr, arr + 6);    //左开右闭区间
	vector<int> test3_2 = { 11,22,33,44 };  //实质上也是调用迭代器初始化vector对象

	//使用拷贝构造初始化一个vector对象
	vector<int> test4(test3);
	return 0;
}

  operator=

  自定义函数要想使用使用常规的操作符执行相应的操作就需要自己重载相应的操作符。在vector类当中为了方便我们使用,特地重载了赋值操作符=。实质上是调用了我们上面构造函数当中的拷贝构造。测试代码如下:

//创建两个vector对象,使用赋值操作符修改指定对象
	vector<int> test1 = { 1,2,3,4 };
	cout << "修改之前的test1对象:";
	for (auto e : test1)
	{
		cout << e << " ";
	}
	cout << endl;
	vector<int> test2 = { 11,22,33,44 };
	test1 = test2;
	cout << "修改之后的test1对象:";
	for (auto e : test1)
	{
		cout << e << " ";
	}

  operator [ ] 

  作为一个顺序表来说,顺序表最大的优势就是可以使用 [ ] 进行指定数据的访问。(数据存储是连续的)所以在vector类当中同样实现了该功能,同样是使用了函数重载的形式实现。使用代码如下:

//创建一个vector对象,使用[]进行数组的遍历
	vector<int> test = { 1,2,3,4,5 };
	int i = 0;
	for (i = 0; i < test.size(); i++)
	{
		cout << test[i] << " ";
	}

  begin & end

  这一对函数的使用方式和我们之前的string相同,同样是为我们的迭代器进行服务的。我们不仅可以通过迭代器进行顺序表的遍历还可以调用 std 库当中的各种函数进行指定的操作,例如逆序,排序操作。其中begin实质上代表的就是顺序表第一个元素的指针,end表示的就是顺序表的尾指针的下一个位置。使用代码如下:

//创建一个vector对象,使用begin和end对vector对象进行指定的处理
	vector<int> test = { 12,2,11,24,77,34,28 };
	//首先利用迭代器对顺序表进行遍历
	std::vector<int>::iterator it = test.begin();
	while (it != test.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	//使用algorithm库当中的sort函数对顺序表当中的数据进行排序
	sort(test.begin(), test.end());
	it = test.begin();
	while (it != test.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	
	//使用std库当中的reverse函数对排序好的顺序表进行逆序操作
	reverse(test.begin(), test.end());
	it = test.begin();
	while (it != test.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

  size & resize

  size是vector对象的一个重要的参数,其表示的是顺序表当中的数据的个数。我们可以通过调用这个函数来查看顺序表当中的数据的个数进而尽心相应的操作。resize的作用是调整顺序表元素的个数。我们可以通过resize开辟相应的数组的空间,并将顺序表进行赋初值。代码如下:

//通过size函数作为结束条件打印顺序表
	vector<int> test = { 1,2,3,4,5 };
	int i = 0;
	while (i < test.size())
	{
		cout << test[i] << " ";
		i++;
	}
	cout << endl;
	//通过resize函数设置size的大小,并为新的空间进行赋初值
	test.resize(8, 0);
	i = 0;
	while (i < test.size())
	{
		cout << test[i] << " ";
		i++;
	}

  capacity & reserve

  和size相对应的就是capacity函数了。capacity的作用就是返回当前顺序表的容量。容量和顺序表的大小有很大的区别,容量必须大于或者等于数据的大小。只有这样才能保证我们的数据不越界。同样的我们可以通过reserve进行修改我们顺序表的容量。(调整我们开辟的空间进行修改)测试代码如下:

//通过调用capacity函数观察顺序表的大小
	vector<int> test = { 1,2,3,4,5,6 };
	cout << "顺序表数据的大小:" << test.size() << " " << "顺序表的容量" << test.capacity() << endl;
	test.reserve(22);
	cout << "顺序表数据的大小:" << test.size() << " " << "顺序表的容量" << test.capacity() << endl;

  push_back & pop_back

  在我们之前对顺序表的书写当中我们会发现:对于顺序表最便利的就是尾插,不需要进行数据的挪动,其他位置都需要或多或少的移动数据的位置。所以为了针对顺序表的这一特性,系统当中还设置了尾插和尾删函数。我们可以通过调用函数对顺序表进行指定的修改。测试代码如下:

//调用尾插函数和尾删函数对顺序表进行指定的操作
	vector<int> test = { 1,2,3,4 };
	//打印原顺序表
	for (auto e : test)
	{
		cout << e << ' ';
	}
	cout << endl;
	//插入最后的数据55
	test.push_back(55);
	for (auto e : test)
	{
		cout << e << ' ';
	}
	cout << endl;
	//删除最后的55
	test.pop_back();
	for (auto e : test)
	{
		cout << e << ' ';
	}
	cout << endl;

  insert & erase

  对于顺序表数据的插入肯定不能只是在顺序表末尾数据的插入,当然还需要有指定位置的数据的插入和删除,所以也就有了insert函数和erase函数了。我们需要向函数当中传入指定位置的下标之后就可以进行相应的操作了。测试代码如下:

    //使用insert向顺序表当中指定位置插入和删除函数
	vector<int> test = { 1,2,3,4,5 };
	print(test);
	//在顺序表的头部插入12
	test.insert(test.begin(), 12);
	print(test);
	//在顺序表第三个元素的位置插入55
	test.insert(test.begin() + 2, 55);
	print(test);
	//删除顺序表当中的最后一个元素
	test.erase(test.end() - 1);
	print(test);

  需要注意的是我们传入的插入函数的位置不能再是一个下标,而应该是一个指针。这个给指针我们可以通过begin函数加减获取。

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

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

相关文章

【Python】OpenCV立体相机配准与三角化代码实现

下面的介绍了使用python和OpenCV对两个相机进行标定、配准,同时实现人体关键点三角化的过程 import cv2 as cv import glob import numpy as np import matplotlib.pyplot as pltdef calibrate_camera(images_folder):images_names = glob.glob(images_folder

css画一条渐变的虚线

效果展示 原理&#xff1a;给元素设置一个渐变的背景色&#xff0c;画一条白色的虚线盖住背景&#xff0c;就达到了渐变虚线的效果 代码&#xff1a; <div class"pending-line"></div>.pending-line{width: 101px;border-top: 2px dashed #fff; // do…

C++算法 —— 动态规划(3)多状态

文章目录 1、动规思路简介2、按摩师3、打家劫舍Ⅱ4、删除并获得点数5、粉刷房子6、买卖股票的最佳时机含冷冻期7、买卖股票的最佳时机含手续费8、买卖股票的最佳时机Ⅲ9、买卖股票的最佳时间Ⅳ 每一种算法都最好看完第一篇再去找要看的博客&#xff0c;因为这样会帮你梳理好思路…

正式支持 NVIDIA A100,吞吐量提高 10 倍的Milvus Cloud2.3 使用指南

Milvus 2.3 正式支持 NVIDIA A100! 作为为数不多的支持 GPU 的向量数据库产品,Milvus 2.3 在吞吐量和低延迟方面都带来了显著的变化,尤其是与此前的 CPU 版本相比,不仅吞吐量提高了 10 倍,还能将延迟控制在极低的水准。 不过,正如我前面提到的,鲜有向量数据库支持 GPU,…

必须收藏 | 如何完全卸载ArcGIS

好多小伙伴在卸载ArcGIS过程都遇到了卸载不彻底无法重新安装新版本&#xff0c;卸载残留的注册表找不到等一系列问题&#xff0c;今天小编为大家整理了几个如何完全卸载ArcGIS的方法&#xff0c;希望能够帮到大家&#xff01; #1快捷版 1、开始>控制面板>添加删除程序&…

MR源码解析和join案例

MR源码解析 new Job(): 读取本地文件, xml配置job.start(): 启动线程job的run():线程方法 runTasks(): 传入对应的接口&#xff0c;启动map或者reduceMapTask类的run(): 设置map阶段的参数&#xff0c;初始化任务&#xff0c;创建上下文对象 创建读取器LineRecordReader判断是…

【计算机网络】HTTPS

文章目录 1. HTTPS的概念2. 加密常见的加密方式对称加密非对称加密 3. HTTPS的工作过程的探究方案1 —— 只使用对称加密方案2 —— 只使用 非对称加密方案3 —— 双方都是用非对称加密方案4 —— 非对称加密对称加密中间人攻击引入证书CA认证理解数据签名 方案5 —— 非对称加…

【Redis】1、NoSQL之Redis的配置及优化

关系数据库与非关系数据库 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&a…

WebGL 绘制矩形

上一节绘制了圆点&#xff0c;调用的绘制方法如下&#xff1a;gl.drawArrays(gl.POINTS, 0, 1); 第一个参数明显是个枚举类型&#xff0c;肯定还有其他值&#xff0c;如下所示&#xff1a; POINTS 可视的点LINES 单独线段LINE_STRIP 线条LINE_LOOP 闭合线条TRIANGLES 单独三…

【Redis7】--1.概述、安装和配置

文章目录 1.Redis概述1.1Redis是什么1.2Redis与MySQL的关系1.3Redis功能1.4Redis优势 2.Redis的安装和配置 1.Redis概述 1.1Redis是什么 Redis全称 远程字典服务器&#xff08;Remote Dictionary Server&#xff09;&#xff0c;它是完全开源的&#xff0c;使用ANSIC语言编写…

算法-26. 删除有序数组中的重复项-⭐

给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你需要做…

【数据分析】Python:处理缺失值的常见方法

在数据分析和机器学习中&#xff0c;缺失值是一种常见的现象。在实际数据集中&#xff0c;某些变量的某些条目可能没有可用的值。处理缺失值是一个重要的数据预处理步骤。在本文中&#xff0c;我们将介绍如何在 Pandas 中处理缺失值。 我们将探讨以下内容&#xff1a; 什么是缺…

php将数组中的最后一个元素放到第一个

array_unshift($firstStepResult, array_pop($firstStepResult)); 转换之后

spring spring-boot spring-cloud spring-cloud-alibaba之间版本对应关系

spring 版本与 jdk 的对应关系 https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions 从 spring 6.0 开始使用 jdk 17 进行编译 对应的相关 servlet 容器&#xff08;tomcat、undertow、jetty等&#xff09;的 servlet 规范转移到 eclipse&…

算法-27.移除元素-⭐

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

MiniDump

一、minidump 模块集成 // .pro QT - guiCONFIG c11 console CONFIG - app_bundle# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consul…

想兼职?学网络安全,钱赚到你手软

前言 疫情过后&#xff0c;现在的经济形式并不好&#xff0c;所以有很多人想在本职工作以外找一份兼职&#xff0c;亦或者担心自己被裁员&#xff0c;想先学一门技术&#xff0c;从而提高自己的抗风险能力&#xff0c;这没有比网络安全更适合的了。如果有基础的小伙伴完全可以…

01深度学习目标检测引入

目标检测是计算机视觉领域的一个重要任务&#xff0c;旨在从图像或视频中准确地检测和定位特定的目标物体。 一、目标检测问题定义 目标检测是在图片中对可变数量的目标进行查找和分类。 二、目标检测过程中的常见的问题 目标种类和数量问题目标尺度问题外在环境干扰问题 三…

IDEA显示val,var的推断类型的设置

在java中val,var可以减少繁琐的代码量&#xff0c;但是IDEA默认关掉自动类型&#xff0c;导致使用val&#xff0c;var表示的不能一言判别类型&#xff0c;并且不能显示点入查看类型的详情因此需要在idea中设置&#xff0c;能够自动显示推断类型。 步骤1 Setting--->editor…

网络安全(黑客)工具大全

还是一句话&#xff0c;功夫再高&#xff0c;也怕菜刀 首先&#xff0c;恭喜你发现了宝藏。 本文章集成了全网优秀的开源攻防武器项目&#xff0c;包含&#xff1a; 信息收集工具&#xff08;自动化利用工具、资产发现工具、目录扫描工具、子域名收集工具、指纹识别工具、端…