【C++】vector 类深度解析:探索动态数组的奥秘

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟  

如果你对string类还存在疑惑,欢迎阅读我之前的作品 :

👉【C++】string 类深度解析:探秘字符串操作的核心

👉【C++】string 类模拟实现:深入探索字符串操作原理

 


目录

💯前言

💯为什么要学习 vector 类

💯标准库中的 vector 类

💯vector 类的内部结构🧐

💯vector 类的构造函数🚀

(一)默认构造函数

(二)带参数的构造函数

💯vector 类的成员函数

 (一)获取数组信息的函数📈

(二)数组修改函数✍️

 (三)获取特定元素的函数🔍

(四)数组查找函数🔎

💯vector 类的操作符重载🎯

(一)赋值操作符(=)

(二)加法操作符(+)

(三)下标操作符([])

💯总结


💯前言

 

 在 C++ 编程中,动态数组的处理是一个重要任务🧐。你是否曾为传统数组的限制和内存管理烦恼😫?vector类提供了便捷解决方案,深入了解它对编程很有意义😎。

相关资料👉 vector官方文档


💯为什么要学习 vector 类

 

(一)动态大小调整

传统数组需指定固定大小,很不方便😒。vector类可动态调整大小,无需事先确定容量,处理不确定数据时更灵活👏。

(二)内存管理自动化

vector类自动处理内存分配和释放,避免内存泄漏和悬空指针等问题,还能高效利用内存空间,自动扩展或收缩内存,很厉害😃。

(三)丰富的操作接口

vector类提供丰富成员函数和操作符重载,操作数组元素更方便直观,插入、删除、查找和修改元素都轻松😎。


💯标准库中的 vector 类

(一)定义与头文件📄

vector类是 C++ 标准库中用于表示和操作动态数组的类,定义在<vector>头文件中。使用时需包含该头文件及using namespace std;,它是普通数组的升级版,扩展和增强了普通数组功能💪。

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

💯vector 类的内部结构🧐

(一)数据成员📊

vector类内部包含指向存储元素内存区域的指针,以及记录元素个数(size容量(capacity的成员变量。这些成员协同工作实现动态数组功能。例如添加元素时,若元素个数等于容量,vector会自动重新分配更大内存空间并复制原有元素,很智能😃。

(二)内存管理💾

vector类采用高效内存管理策略。扩展内存时通常成倍增加容量,减少内存分配次数,提高性能。删除元素时也会适当调整内存空间,避免浪费😘。


💯vector 类的构造函数🚀

(一)默认构造函数

vector类的默认构造函数创建空vector对象,初始大小为 0。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v;cout << "默认构造函数创建的vector对象的大小为: " << v.size() << endl;return 0;
}

(二)带参数的构造函数

可用指定大小和初始值构造vector对象。如用整数参数指定初始大小,元素默认初始化

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v(5);cout << "使用指定大小构造的vector对象的大小为: " << v.size() << endl;return 0;
}

也可用两个参数,一个指定大小,另一个指定初始值

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v(5, 10);cout << "使用指定大小和初始值构造的vector对象的大小为: " << v.size() << endl;cout << "第一个元素的值为: " << v[0] << endl;return 0;
}


💯vector 类的成员函数

函数名称功能说明
size(重点)⭐返回vector中当前元素个数😃
capacity返回vector当前分配的内存容量🧐
empty(重点)⭐检测vector是否为空,是则返回true,否则返回false😏
clear(重点)⭐清空vector中所有元素🧹
reserve(重点)⭐vector预留指定大小的内存空间📦
resize(重点)⭐vector的元素个数调整为n个,如果n大于当前元素个数,则用默认值填充新增元素空间;如果n小于当前元素个数,则删除多余元素✂️
at通过下标安全地访问vector中的元素,如果下标越界则抛出异常🚫
front返回vector中的第一个元素👑
back返回vector中的最后一个元素🏁
push_backvector的末尾添加一个元素➕
pop_backvector的末尾删除一个元素➖
insert在指定位置插入一个或多个元素✏️[
erase删除vector中的指定元素或元素区

 (一)获取数组信息的函数📈

1.size()capacity()函数

size()函数返回vector中实际元素个数,capacity()函数返回当前分配内存能容纳的元素个数。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v(5);cout << "vector的元素个数为: " << v.size() << ",容量为: " << v.capacity() << endl;return 0;
}

2.empty()函数

用于检测vector是否为空。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v;cout << "vector是否为空: " << (v.empty()? "是" : "否") << endl;return 0;
}

(二)数组修改函数✍️

 

1.push_back()函数

push_back()函数用于在vector的末尾添加一个元素,是常用方法。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v;v.push_back(1);cout << "添加元素后的vector的元素个数为: " << v.size() << endl;return 0;
}

 2.pop_back()函数

pop_back()函数用于从vector的末尾删除一个元素。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v(5);v.pop_back();cout << "删除元素后的vector的元素个数为: " << v.size() << endl;return 0;
}

 3.insert()函数

insert()函数用于在指定位置插入一个或多个元素,需指定位置和要插入的元素。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v(5);v.insert(v.begin() + 2, 10);cout << "插入元素后的vector的元素个数为: " << v.size() << endl;cout << "插入元素后的vector的第3个元素为: " << v[2] << endl;return 0;
}

4.erase()函数

erase()函数用于删除vector中的指定元素或元素区间,需指定要删除的元素位置。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v(5);v.erase(v.begin() + 2);cout << "删除元素后的vector的元素个数为: " << v.size() << endl;cout << "删除元素后的vector的第3个档案为: " << v[2] << endl;return 0;
}

 (三)获取特定元素的函数🔍

1.at()函数

at()函数通过下标安全地访问vector中的元素,下标越界会抛出异常。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v(5);try {cout << "使用at()函数访问第3个元素: " << v.at(2) << endl;} catch (const out_of_range& e) {cout << "下标越界异常: " << e.what() << endl;}return 0;
}

 2.front()函数

front()函数返回vector中的第一个元素。例如:

#include <iostream>
#include <vector>using namespace std;
int main() {vector<int> v(5);cout << "第一个元素的值为: " << v.front() << endl;return 0;
}

 3.back()函数

back()函数返回vector中的最后一个元素。例如:

#include <iostream>
#include <vector>using namespace std;
int main() {vector<int> v(5);cout << "最后一个元素的值为: " << v.back() << endl;return 0;
}

(四)数组查找函数🔎

 

vector中,可通过逐个比较元素实现两个vector的比较。查找元素位置可使用std::find()算法结合vector的迭代器。例如:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {vector<int> v(5);v[0] = 1;v[1] = 2;v[2] = 3;auto it = std::find(v.begin(), v.end(), 3);if (it!= v.end()) {cout << "找到元素的位置为: " << (it - v.begin()) << endl;} else {cout << "未找到元素" << endl;}return 0;
}

 


💯vector 类的操作符重载🎯

(一)赋值操作符(=)

 

vector类重载了赋值操作符,可将一个vector对象赋值给另一个。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v1(5);vector<int> v2;v2 = v1;cout << "赋值后的v2的元素个数为: " << v2.size() << endl;return 0;
}

(二)加法操作符(+)

 

虽 C++ 标准库未直接定义vector类加法操作符重载,但可通过自定义函数或算法库函数实现类似功能。例如使用std::merge()函数合并两个vector模拟加法效果。如下:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {vector<int> v1{1, 2, 3, 4, 5};vector<int> v2{6, 7, 8};vector<int> v3;merge(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(v3));cout << "合并后的 v3 的元素个数为: " << v3.size() << endl;for (const auto& element : v3) {cout << element << " ";}cout << endl;return 0;
}

(三)下标操作符([])

 

vector类重载了下标操作符,可通过下标访问vector中的单个元素。例如:

#include <iostream>
#include <vector>using namespace std;int main() {vector<int> v(5);v[0] = 1;cout << "vector中的第1个元素为: " << v[0] << endl;return 0;
}

 


💯总结

🍎C++ 的vector类是强大且方便的动态数组工具。

其内部结构、构造函数、成员函数和操作符重载等特性,使动态数组操作更简单高效。通过深入理解vector类,我们能更好地解决编程问题,提高程序质量和效率。在实际编程中,应充分利用其优势,避免常见错误,如越界访问元素等。


C++ 的世界丰富多彩,我将为大家带来更多精彩的内容。期待与你们一同在 C++ 的知识海洋中遨游。欢迎关注我👉【A Charmer】   

 

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

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

相关文章

Hugging Face 平台轻松上手 | 书生大模型

文章目录 HF 的 Transformers 库GitHub CodeSpace 使用终端安装依赖下载 internlm2_5-7b-chat 的配置文件 参考文献 HF 的 Transformers 库 直接使用预训练模型进行推理提供了大量预训练模型可供使用使用预训练模型进行迁移学习 因此在使用 HF 前&#xff0c;我们需要下载 Tra…

项目升级到.Net8.0 Autofac引发诡异的问题

前两天把项目升级到.Net8.0了&#xff0c;把.Net框架升级了&#xff0c;其他一些第三方库升级了一部分&#xff0c;升级完以后项目跑不起来了&#xff0c;报如下错误&#xff1a; An unhandled exception occurred while processing the request. DependencyResolutionExcepti…

如何开发查找附近地点的微信小程序

我开发的是找附近卫生间的小程序。 在现代城市生活中&#xff0c;找到一个干净、方便的公共卫生间有时可能是一个挑战。为了解决这个问题&#xff0c;我们可以开发一款微信小程序&#xff0c;帮助用户快速找到附近的卫生间。本文将介绍如何开发这样一款小程序&#xff0c;包…

canfestival主站多电机对象字典配置

不要使用数组进行命名&#xff1a;无法运行PDO 使用各自命名的方式&#xff1a;

楼宇智慧公厕为用户提供清晰厕位引导,提高用厕效率

如今楼宇管理者越来越重视公共设施的优化&#xff0c;尤其是公厕的管理。楼宇智慧公厕系统通过先进的技术&#xff0c;为用户提供清晰的厕位引导&#xff0c;显著提高了用厕效率。本文将从两个方面介绍楼宇智慧公厕系统的功能及其带来的好处。 一、清晰厕位引导 楼宇智慧公厕系…

Ubuntu 20.04 安装 QGC v4.3 开发环境

Ubuntu 20.04 安装 QGC开发环境 1. 准备安装 Qt 5.15.2安装依赖获取源码 2. 编译参考 前言 QGC ( QGroundControl) 是一个开源地面站&#xff0c;基于QT开发的&#xff0c;有跨平台的功能。可以在Windows&#xff0c;Android&#xff0c;MacOS或Linux上运行。它可以将PX4固件加…

使用匿名管道时出现程序一直运行问题

父进程创建两个子进程&#xff0c;父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息&#xff0c;体现通信效果。(源程序pipe_1.c) 一开始&#xff0c;我忘了初始化pipe,很傻*的直接把fd当管道使&#xff0c;出现了儿子喊爸爸"i am your father."的…

uniapp实现H5和微信小程序获取当前位置(腾讯地图)

之前的一个老项目&#xff0c;使用 uniapp 的 uni.getLocation 发现H5端定位不准确&#xff0c;比如余杭区会定位到临平区&#xff0c;根据官方文档初步判断是项目的uniapp的版本太低。 我选择的方式不是区更新uniapp的版本&#xff0c;是直接使用高德地图的api获取定位。 1.首…

小菜家教平台(四):基于SpringBoot+Vue打造一站式学习管理系统

前言 昨天配置完了过滤器&#xff0c;权限检验&#xff0c;基本的SpringSecurity功能已经配置的差不多了&#xff0c;今天继续开发&#xff0c;明天可能会暂停一天整理一下需求&#xff0c;然后就进行CRUD了。 今日进度 补充SpringSecurity异常处理和全局异常处理器 详细操作…

MES管理系统的生产绩效分析与资源可追踪性

在探讨MES管理系统的核心功能时&#xff0c;生产绩效分析与资源可追踪性是两个不可或缺的关键要素。它们共同构成了MES管理系统中对于生产效率、成本控制以及产品质量进行精细管理的基石。以下是对这两个关键领域的深入剖析与重新阐述。 MES管理系统中的生产绩效分析&#xff0…

无人车之路径规划篇

无人车的路径规划是指在一定的环境模型基础上&#xff0c;给定无人车起始点和目标点后&#xff0c;按照性能指标规划出一条无碰撞、能安全到达目标点的有效路径。 一、路径规划的重要性 路径规划对于无人车的安全、高效运行至关重要。它不仅能够提高交通效率&#xff0c;减少交…

unocss 添加支持使用本地 svg 预设图标,并支持更改大小

安装 pnpm install iconify/utils 在配置文件 unocss.config.ts&#xff1a; presets > presetIcons 选项中 通过 FileSystemIconLoader 加载本地图标&#xff0c;并指定目录。 import presetWeapp from unocss-preset-weapp import { extractorAttributify, transformer…

从0开始学习Linux——网络配置

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 上一个教程中&#xff0c;我们了解了…

Spring中的 InitializingBean、BeanPostProcessor、@PostConstruct 等初始化动作的执行时机分析

初始化Bean的时序图如下&#xff1a; 小结说明&#xff1a; 1、相同点&#xff1a;InitializingBean 的(afterPropertiesSet方法)、BeanPostProcessor、PostConstruct 都是在bean的属性注入完毕之后才执行&#xff0c;都可以用来进行bean的初始化动作 2、初始化执行顺序优先级…

【初阶数据结构与算法】沉浸式刷题之顺序表练习(顺序表以及双指针两种方法)

文章目录 顺序表练习1.移除数组中指定的元素方法1&#xff08;顺序表&#xff09;方法2&#xff08;双指针&#xff09; 2.删除有序数组中的重复项方法1&#xff08;顺序表&#xff09;方法2&#xff08;双指针&#xff09; 3.双指针练习之合并两个有序数组方法1&#xff08;直…

996引擎 - 活捉NPC

996引擎 - 活捉NPC 引擎触发 - 引擎事件(QF)事件处理模块 GameEvent测试文件参考资料 引擎触发 - 引擎事件(QF) cfg_game_data 配置 ShareNpc1 可以将QM和机器人的触发事件全部转到 QF 引擎触发是通用的,TXT的所有触发转换成小写后在LUA中就可使用,如说明书中缺省可反馈至对接群…

第十三届交通运输研究(上海)论坛┆新发展格局下高铁物流运输模式分析

0. 简介 交通运输研究&#xff08;上海&#xff09;论坛&#xff08;简称为TRF&#xff09;是按照国际会议的组织原则&#xff0c;为综合交通运输领域学者们构建的良好合作交流平台。交通运输研究&#xff08;上海&#xff09;论坛已经成功举办了十二届&#xff0c;凝聚了全国…

Qos基本原理+园区网络

解决网络拥塞最直接就是增加带宽&#xff0c;但是费钱。可以用Qos解决 Qos( Quality of Service) 设置不同流量不同优先级 1. QoS技术概述 延迟 v.s. 延迟抖动 延迟 vs 延迟抖动 延迟&#xff1a;指一个数据包从源端传输到目的端所需要的时间。延迟是一个静态的值&#xff0…

SQL用一个字段查询出数据的交集

出个SQL查询的题吧&#xff0c;有兴趣的可以看看 1、问题 下面有一份数据&#xff08;图1&#xff09;&#xff0c;由两部分组成&#xff1a;分析数据和基准数据 分析数据标识列为1&#xff0c;基准数据标识列为1&#xff0c;两字段0,1互斥 要求&#xff1a;按找出两部分数据…

【后端】javaweb过滤器Filter

过滤器Filter 实现敏感词、只能通过登录进入页面。 原理 当我们使用过滤器时&#xff0c;过滤器会对游览器的请求进行过滤&#xff0c;过滤器可以动态的分为3个部分&#xff0c;1.放行之前的代码&#xff0c;2.放行&#xff0c;3.放行后的代码&#xff0c;这3个部分分别会发挥…