C++初阶:STL详解(三)——vector的介绍和使用

news2024/9/19 10:42:09

✨✨小新课堂开课了,欢迎欢迎~✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:C++:由浅入深篇

小新的主页:编程版小新-CSDN博客

前言:

前面我们刚刚了解了string类的使用和模拟实现,当对string有了一定的了解后,再来看vector的使用和后面要提到模拟实现是很好上手的。

C++初阶:STL详解(一)——string类-CSDN博客

C++初阶:string类的模拟实现-CSDN博客

一.什么是vector?

vector(向量)是C++标准库中的一种序列容器,它是一种非常常用的动态数组实现。可以高效的存储和访问一组相同类型的元素,能够自动管理储存,可动态增长或收缩。

 vector是一个模板类,定义在头文件(include<vector>)中,可以使用vector来存储和访问任意类型的对象。

二.vector的特性

1.动态数组:可以动态地增加和减少数组元素,自动管理内存分配和释放,不需要手动进行内存操作。

2.高效随机访问:支持随机访问

3.连续存储:元素在内存中连续存储

4.支持插入和删除:在尾部或头部插入和删除元素通常是高效的,但是其他位置的效率较低。

5.丰富的接口:提供了多种成员函数,如push_back,pop_back,insert,erase等,方便进行各种操作。

三.vector的文档介绍 

vector - C++ Reference(英文版)

std::vector - cppreference.com(中文版)

四.vector的使用

vector 在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的 。我们在后面模拟实现的时候,也是实现这些常见的接口。

4.1vector的定义

(constructor)构造函数声明接口说明
vector()(重点)无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化n个val

vector (const vector& x); (重点)

拷贝构造

vector (InputIterator first, InputIterator last);使用迭代器进行初始化构造

1.vector(): 构造一个空vector

vector<int> v1;//构造一个int 类型的空容器

2.vector(size_type n, const value_type& val = value_type()):构造一个vector,元素个数为n,元素为value_type()

vector<int> v2(10, 1);//构造一个含有10个1的int类型容器

vector<char> v5(10, 'c'); //构造一个含有10个c的char类型容器

3. vector (const vector& x) :拷贝构造

vector<int> v3(v2);//拷贝构造

4.vector (InputIterator first, InputIterator last) :使用迭代器区间进行初始化构造

vector<int> v4(v2.begin(), v2.end());//使用迭代器区间拷贝构造v2容器的一部分

4.2vector的空间增长问题

容量空间接口说明

size获取数据个数

capacity获取容量大小

empty判断是否为空

resize(重点)改变vector的size

reserve (重点)改变vector的capacity

size和capacity

void vector2()
{
	vector<int> v1(10, 1);

	cout << "size:" << v1.size() << endl;//获取当前容器有效元素的个数

	cout << "capacity:" << v1.capacity() << endl;//获取当前容器的容量大小

}

运行结果:

小扩展:

我们在说string类的时候,也提到过。capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是2倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。

empty

用于判断当前容器是否为空,true:返回非0(一般是1):;false:返回0。

void vector2()
{
	vector<int> v1(10, 1);

	cout << v1.empty() << endl;
}

运行结果:0

resize和reserve

resize函数改变容器中的有效元素个数,reserse函数改变容器的容量。

resize规则:
 1、当所给值大于容当前容器的size时,将size扩大到该值,扩大的元素为第二个所给值,若未给出,则int型默认为0,char型默认是'\0'。

   2、当所给值小于容器当前的size时,将size缩小到该值。

reserve规则:
 1、当所给值大于当前容器的capacity时,将capacity扩大到该值。
 2、当所给值小于当前容器的capacity时,什么也不做,不会缩容。

void vector2()
{

    vector<int> v(10, 1);
	cout << "size:" << v.size() << endl;
    cout << "capacity:" << v.capacity() << endl;

	v.reserve(20);//改变当前容器的容量为20
	cout << "size:" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;

	v.resize(5);//改变当前容器的size为5
	cout << "size:" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;

}

运行结果:

注意:reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。resize在开空间的同时还会进行初始化,影响size。

4.3vector迭代器的使用

iterator的使用接口说明
begin + end(重点)begin获取第一个数据位置的iterator/const_iterator, end获取最后一个数据的下一个位置的iterator/const_iterator
rbegin + rendrbegin获取最后一个数据位置的reverse_iterator,rend获取第一个数据前一个位置的reverse_iterator
 

void vector3()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };

	vector<int> v(begin(arr), end(arr));//C++11将一个整形数组装换为vector

	//正向迭代器进行遍历
	cout << "正向迭代器遍历:";
	vector<int>:: iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}

	cout << endl;

	//反向迭代器遍历
	cout << "反向迭代器遍历:";
	vector<int>::reverse_iterator rit = v.rbegin();
	while (rit != v.rend())
	{
		cout << *rit << " ";
		rit++;
	}

	cout << endl;

}

运行结果:

除了上面遍历的方式,我们知道支持迭代器就支持范围for,因此我们也可以使用范围for对容器进行遍历。

void vector3()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };

	vector<int> v(begin(arr), end(arr));//C++11将一个整形数组装换为vector

	for (auto ch : v)
	{
		cout << ch << " ";
	}

}

运行结果:

4.4vector的增删查改

vector增删查改接口说明
push_back(重点)尾插
pop_back (重点)尾删
find查找。(注意这个是算法模块实现,不是vector的成员接口)
insert在position之前插入val
erase删除position位置的数据
swap交换两个vector的数据空间
operator[] (重点)像数组一样访问

push_back 和 pop_back

void vector4()
{
	vector<int> v;
	v.push_back(1);//尾插
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	v.pop_back();//尾删

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

}

运行结果:

find

find:
template <class InputIterator, class T>
   InputIterator find (InputIterator first, InputIterator last, const T& val)

find函数有三个参数,前两个参数确定了一个迭代器区间(左闭右开),第三个参数确定所要寻找的值。find函数在所给迭代器区间寻找第一个匹配的元素,并返回它的迭代器,若未找到,则返回所给的第二个参数。 

insert和erase 

void vector4()
{
	vector<int> v;
	v.push_back(1);//尾插
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	vector<int>:: iterator pos = find(v.begin(), v.end(), 3);//返回元素为3位置的迭代器

	v.insert(pos, 8);//在pos位置插入一个8

	pos = find(v.begin(), v.end(), 4);

	v.erase(pos);//删除pos位置的元素
	
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}

	cout << endl;
	
}

运行结果:

swap

swap函数可以交换两个容器的数据空间,实现两个容器的交换。

void vector5()
{
	vector<int> v1(10, 1);
    vector<int> v2(5, 2);

	cout << "交换前:" << endl;
	cout << "v1:" << v1.size() <<" "<< v1.capacity() << endl;
	cout << "v2:" << v2.size() <<" "<< v2.capacity() << endl;

	swap(v1,v2);

	cout << "交换后:" << endl;
	cout << "v1:" << v1.size() <<" "<< v1.capacity() << endl;
	cout << "v2:" << v2.size() << " "<<v2.capacity() << endl;
}

运行结果:

operator[]

vector当中实现了 [ ] 操作符的重载,因此我们也可以通过“下标+[ ]”的方式对容器当中的元素进行访问。当然也可以对其进行修改。

void vector6()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };

	vector<int> v(begin(arr), end(arr));//C++11将一个整形数组装换为vector

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

运行结果:

 不知不觉中,我们就已经知道了四种遍历容器的方式了:下标+[]/正向迭代器/反向迭代器/范围for。

总结:

以上就是对vector及其常见接口的介绍,这里还有一个经典的迭代器失效的问题,我们后面讲,vector的难点在于模拟实现,这个放在迭代器失效问题之后也会讲。

感谢大家的观看,创作不易,还请各位大佬点赞支持~

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

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

相关文章

STM32外设之LTDC/DMA2D—液晶显示(野火)

文章目录 显示屏有几种?基本参数控制?显存 LTDC 液晶控制器LTDC 结构框图LTDC 初始化结构体 LTDC_InitTypeDefLTDC 层级初始化结构体 DMA2D 图形加速器DMA2D 初始化结构体 要了解什么 屏幕是什么&#xff0c;有几种屏&#xff0c;有什么组成。 怎么控制&#xff0c;不同屏幕控…

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解 1.FastGPT快速使用:基本设置、核心模块讲解 1.1 知识库设置 首先我们需要创建一个知识库。 知识库创建完之后我们需要上传一点内容。 上传内容这里有四种模式: 手动输入:手动输入问…

php部署到apach服务器上遇到的问题

php部署到apach服务器上遇到的问题 问题描述解决方案 问题描述 参考环境搭建文章&#xff1a; 链接: Windows本地搭建PHP环境 第六步的第二条中出现无法正常访问http://localhost:8888/index.php的情况。 解决方案 思路&#xff1a;之前的http://localhost:8888是可以正常访…

收购芯片设计公司Annapurna Labs后

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Linux-mysql5.7-mysql8.0安装包下载及安装教程,二合一

一、安装包下载 1、手动下载 MySQL :: Download MySQL Community Server 2、wegt下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 登录自己的liunx &#xff0c;复制上面的命令下载。 二、手动安装 1、上传压缩包到…

Tomcat端口号被占用

1.当启动了Tomcat后再打开idea运行web项目下的Tomcat就会报这个“Tomcat端口号被占用”错误&#xff0c;解决办法就是关闭Tomcat&#xff08;用tomcat文件里面的shutdown.bat关闭&#xff0c;也可以在exe程序里面关闭&#xff09;&#xff0c;再在idea中运行web项目下的Tomca …

华为OD机试真题-九宫格按键输入-2024年OD统一考试(E卷)

最新华为OD机试考点合集&#xff1a;华为OD机试2024年真题题库&#xff08;E卷D卷C卷&#xff09;_华为od机试题库-CSDN博客 题目描述 九宫格按键输入&#xff0c;有英文和数字两个模式&#xff0c;默认是数字模式&#xff0c;数字模式直接输出数字&#xff0c;英文模式连…

在typescript浏览器端中调用C++编写的函数,WebAssembly传递指针类型的参数,以及处理指针类型的返回值。

首先要在Cmake工程中的cmakelists.txt文件中引入Emscripten工具链&#xff1a; set(CMAKE_TOOLCHAIN_FILE "D:/CppPkg/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake")直接看C代码&#xff1a; #include <emscripten/emscripten.h> #i…

服务器——装新的CUDA版本的方法

服务器——装新的CUDA版本 一、进入 CUDA 版本列表二、根据自己服务器&#xff0c;选择对应的版本和配置三、使用管理员用户&#xff0c;运行下载和安装命令四、查看显卡驱动是否安装4.1 若安装了显卡驱动4.2 若显卡驱动没安装 参考文章 一、进入 CUDA 版本列表 CUDA Toolkit …

MFC工控项目实例之十七添加手动测试界面

承接专栏《MFC工控项目实例之十六输入信号验证》 1、在JogTest.h文件中添加代码 class CJogTest : public CDialog { public:CJogTest(CWnd* pParent NULL); // standard constructorCButtonST m_btnStart[16];CFont m_font; ... } 2、在JogTest.cpp文件中添加代码 #…

【医药行业】实施SAP有哪些医药行业GXP的合规要求和注意事项

作为实施过辉瑞和赛诺菲医药行业的项目&#xff0c;总结了如下&#xff1a; 在医药行业中&#xff0c;GxP&#xff08;Good Practices&#xff0c;良好规范&#xff09;是一系列标准与指南&#xff0c;旨在确保制药、医疗设备和生物制品的质量与合规性。GxP包括多个领域&#x…

计算机网络通关学习(一)

简介 之前我通过王道的考研课进行了计算机网络的学习&#xff0c;但是在秋招准备过程中发现之前的笔记很多不足&#xff0c;学习的知识不够深入和巩固&#xff0c;所以再重新对《图解HTTP》&《图解TCP/IP》进行深度学习后&#xff0c;总结出了此篇博客&#xff0c;由于内容…

re题(27)BUUFCTF-[MRCTF2020]Transform

BUUCTF在线评测 (buuoj.cn) 先到ida&#xff0c;先看一下字符串 找到主函数 int __cdecl main(int argc, const char **argv, const char **envp) {char Str[104]; // [rsp20h] [rbp-70h] BYREFint j; // [rsp88h] [rbp-8h]int i; // [rsp8Ch] [rbp-4h]sub_402230(argc, arg…

ai扩图用什么软件?探索五大高效工具

Hey朋友们&#xff0c;最近在社交媒体上看到不少超清晰的美图&#xff0c;是不是特别羡慕&#xff1f; 别急&#xff0c;告诉你个秘密武器——ai扩图软件。这些神器能帮你智能扩展图片内容&#xff0c;让每张图都充满细节。 想知道都有哪些好用的ai扩图软件免费吗&#xff1f…

CentOS上使用rpm离线安装Mosquitto(Linux上Mqtt协议调试工具)附资源下载

场景 Windows上Mqtt服务器搭建与使用客户端工具MqttBox进行测试&#xff1a; Windows上Mqtt服务器搭建与使用客户端工具MqttBox进行测试_微软消息队列 测试工具-CSDN博客 Windows服务器上Mqtt服务器EMQX的安装使用&#xff1a; Windows服务器上Mqtt服务器EMQX的安装使用_wi…

Objects as Points基于中心点的目标检测方法CenterNet—CVPR2019

Anchor Free目标检测算法—CenterNet Objects as Points论文解析 Anchor Free和Anchor Base方法的区别在于是否在检测的过程中生成大量的先验框。CenterNet直接预测物体的中心点的位置坐标。 CenterNet本质上类似于一种关键点的识别。识别的是物体的中心点位置。 有了中心点之…

Python青少年简明教程:tkinter库入门

Python青少年简明教程&#xff1a;tkinter库入门 tkinter是Python的标准GUI&#xff08;图形用户界面&#xff09;库。它提供了一种快速而简单的方法来创建GUI应用程序。tkinter是Python自带的&#xff0c;无需额外安装&#xff0c;随 Python 安装包一起提供。 在Python 3.x中…

Leetcode—1137. 第 N 个泰波那契数【简单】

2024每日刷题&#xff08;160&#xff09; Leetcode—1137. 第 N 个泰波那契数 记忆化搜索实现代码 class Solution { public:int tribonacci(int n) {int zero 0;int one 1;int two 1;if(n 0) {return zero;}if(n 1) {return one;}if(n 2) {return two;}int ans 0;fo…

三重因素,巨人瘦身——从 IBM中国研发部裁员讲起

如何看待IBM中国研发部裁员&#xff1f;近日&#xff0c;IBM中国宣布撤出在华两大研发中心&#xff0c;引发了IT行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅影响了众多IT从业者的职业发展&#xff0c;也让人思考全球化背景下中国IT产业的竞争力和未来发展方向。面对…

手机、平板电脑编程———未来之窗行业应用跨平台架构

一、平板编程优点 1. 便携性强 - 可以随时随地携带平板进行编程&#xff0c;不受地点限制&#xff0c;方便在旅行、出差或休息时间进行学习和开发。 2. 直观的触摸操作 - 利用触摸屏幕进行代码编辑、缩放、拖动等操作&#xff0c;提供了一种直观和自然的交互方式。 …