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

news2024/11/26 4:43:48

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

如果你对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.coloradmin.cn/o/2232193.html

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

相关文章

windows——病毒的编写

声明 学习视频来自B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 windows基础 我们学习了前面的window…

STM32 + CubeMX + 硬件SPI + W5500 +UDP

这篇文章记录一下STM32W5500UDP的调试过程&#xff0c;实现UDP数据的接收与发送。 目录 一、W5500模块介绍二、Stm32CubeMx配置三、Keil代码编写1、添加W5500驱动代码到工程&#xff08;添加方法不赘述&#xff0c;驱动代码可以在官网找&#xff09;2、在工程中增加代码&#…

原来大佬的测试用例都是这样写的...

1、测试点与测试用例 测试点不等于测试用例&#xff0c;这是我们首先需要认识到的。 问题1&#xff1a;这些测试点在内容上有重复&#xff0c;存在冗余。 问题2&#xff1a;一些测试点的测试输入不明确&#xff0c;不知道测试时要测试哪些。 问题3&#xff1a;总是在搭相似…

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入

【论文解读】Med-BERT: 用于疾病预测的大规模结构化电子健康记录的预训练情境化嵌入 Med-BERT:pretrained contextualized embeddings on large-scale structured electronic health records for disease prediction ​ ​ 摘要:基于电子健康记录(EHR)的深度学习(DL)预…

天锐绿盾加密软件与Ping32 — 数据安全与性能优化的完美结合

在数字化时代&#xff0c;企业对数据安全的重视程度日益增加。随着网络攻击和数据泄漏事件频发&#xff0c;选择合适的安全解决方案显得尤为重要。天锐绿盾与Ping32作为两款备受推崇的安全软件&#xff0c;各自为企业提供了独特的功能和优势&#xff0c;共同为企业的数据安全和…

随身WiFi三网切换靠谱吗?格行随身WiFi网速怎么样?

出门在外手机流量不够用&#xff0c;连接公共WIFI网速不稳定还存在安全隐患。小巧便携的随身WIFI成了外出用网的首选。面对市面上不同品牌&#xff0c;不同类型的随身WIFI不少朋友不免心生疑问&#xff1a;随身WIFI到底值不值得买&#xff1f;究竟是不是“智商税”&#xff1f;…

服务器数据恢复—SAN环境中LUN映射错误导致文件系统一致性出错的数据恢复案例

服务器数据恢复环境&#xff1a; SAN光纤网络环境&#xff0c;存储由一组6块硬盘组建的RAID6阵列构成&#xff0c;划分为若干LUN&#xff0c;MAP到跑不同业务的SUN SOLARIS操作系统服务器上。 服务器故障&分析&#xff1a; 因为业务需要&#xff0c;用户在该光纤存储环境中…

【skywalking 】More than 15,000 ‘grammar‘ tokens have been presented. 【未解决请求答案】

问题 skywalking相关版本信息 jdk&#xff1a;17skywalking&#xff1a;10.1.0apache-skywalking-java-agent&#xff1a;9.3.0ElasticSearch : 8.8.2 问题描述 More than 15,000 grammar tokens have been presented. To prevent Denial Of Service attacks, parsing has b…

004-Kotlin界面开发快速入水之TicTacToe

程序界面和效果 快速入水 要学习一样跟程序设计有关的东西&#xff0c;最好的办法始终是把手打湿&#xff0c;整一个能够运行&#xff0c;可以实验的东西出来。 也只有在程序开发中&#xff0c;我们才能想一个魔法师而不是魔术师&#xff0c;我们真的能够创造一个东西。而且编…

Node.js:Express 服务 路由

Node.js&#xff1a;Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架&#xff0c;可以快速开发一个web框架。本质是一个包&#xff0c;可以通过npm直接下载。 创建服务 Express创建一…

C语言 | Leetcode C语言题解之第530题二叉搜索树的最小绝对差

题目&#xff1a; 题解&#xff1a; void dfs(struct TreeNode* root, int* pre, int* ans) {if (root NULL) {return;}dfs(root->left, pre, ans);if (*pre -1) {*pre root->val;} else {*ans fmin(*ans, root->val - (*pre));*pre root->val;}dfs(root->…

重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 整合 Elasticsearch 8.x &#xff08;二&#xff09;使用Repository 1. 环境准备1.1 项目依赖1.2 Elasticsearch 配置 2. 使用Repository的基本步骤2.1 创建实体类2.2 创…

SpringBoot源码(四):run() 方法解析(一)

run()方法&#xff1a; public ConfigurableApplicationContext run(String... args) {// 记录应用启动时间long startTime System.nanoTime();DefaultBootstrapContext bootstrapContext createBootstrapContext();// 创建 ConfigurableApplicationContext 对象Configurabl…

ASP .NET CORE 6 在项目中集成WatchDog开源项目

概念 WatchDog是一个开源的项目&#xff0c;可以实现对.Net 应用程序和API实现实时应用日志和性能监控平台。可以实现实时记录和查看应用程序中的消息、事件、HTTP请求和响应&#xff0c;以及运行时捕获的异常&#xff0c;有效帮助开发人员去排查应用异常&#xff0c;提升开发效…

分类算法——决策树 详解

决策树的底层原理 决策树是一种常用的分类和回归算法&#xff0c;其基本原理是通过一系列的简单决策&#xff0c;将数据集划分为多个子集&#xff0c;从而实现分类。决策树的核心思想是通过树形结构表示决策过程&#xff0c;节点代表特征&#xff0c;边代表决策&#xff0c;叶子…

python 使用进程池并发执行 SQL 语句

这段代码使用了 Python 的 multiprocessing 模块来实现真正的并行处理&#xff0c;绕过 Python 的全局解释器锁&#xff08;GIL&#xff09;限制&#xff0c;从而在多核 CPU 上并发执行多个 SQL 语句。 from pyhive import hive import multiprocessing# 建立连接 conn hive.…

[ 问题解决篇 ] win11中本地组策略编辑器gpedit.msc打不开(gpedit.msc缺失)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

[Python学习日记-55] 软件开发目录设计规范

[Python学习日记-55] 软件开发目录设计规范 简介 为什么要设计好目录结构&#xff1f; 目录组织方式 关于 README 的内容 关于 setup.py 和 requirements.txt 关于配置文件的使用方法 简介 我们在浏览一些开源项目或者是一些安装后的软件的时候会发现&#xff0c;不同的两…

18.农产品销售系统(基于springboot和vue的Java项目)

目录 1.系统的受众说明 2.开发环境与技术 2.1 Java语言 2.2 MYSQL数据库 2.3 IDEA开发工具 2.4 Spring Boot框架 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统流程 3.2.1 操作流程 3.2.2 登录流程 3.2.3 删除信…

嵌入式常用功能之通讯协议1--IIC

嵌入式常用功能之通讯协议1--串口 嵌入式常用功能之通讯协议1--IIC&#xff08;本文&#xff09; 嵌入式常用功能之通讯协议1--SPI 一、IIC总线协议介绍 Inter-Integrated Circuit(集成电路总线&#xff09;&#xff0c;是由 Philips 半导体公司&#xff08;现在的 NXP 半导体…