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

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

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

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

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


目录

💯前言

[💯为什么要学习 vector 类](#💯为什么要学习 vector 类)

[💯标准库中的 vector 类](#💯标准库中的 vector 类)

[💯vector 类的内部结构🧐](#💯vector 类的内部结构🧐)

[💯vector 类的构造函数🚀](#💯vector 类的构造函数🚀)

(一)默认构造函数

(二)带参数的构造函数

[💯vector 类的成员函数](#💯vector 类的成员函数)

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

(二)数组修改函数✍️

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

(四)数组查找函数🔎

[💯vector 类的操作符重载🎯](#💯vector 类的操作符重载🎯)

(一)赋值操作符(=)

(二)加法操作符(+)

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

💯总结


💯前言

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

相关资料👉 vector官方文档


💯为什么要学习 vector 类

(一)动态大小调整

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

(二)内存管理自动化

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

(三)丰富的操作接口

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


💯标准库中的 vector 类

(一)定义与头文件📄

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

cpp 复制代码
#include<iostream>
#include<vector>

using namespace std;

💯vector 类的内部结构🧐

(一)数据成员📊

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

(二)内存管理💾

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


💯vector 类的构造函数🚀

(一)默认构造函数

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

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

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

(二)带参数的构造函数

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

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

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

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

cpp 复制代码
#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_back 在vector的末尾添加一个元素➕
pop_back 从vector的末尾删除一个元素➖
insert 在指定位置插入一个或多个元素✏️[
erase 删除vector中的指定元素或元素区

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

1.size()和capacity()函数

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

cpp 复制代码
#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是否为空。例如:

cpp 复制代码
#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的末尾添加一个元素,是常用方法。例如:

cpp 复制代码
#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的末尾删除一个元素。例如:

cpp 复制代码
#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()**函数用于在指定位置插入一个或多个元素,需指定位置和要插入的元素。例如:

cpp 复制代码
#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中的指定元素或元素区间,需指定要删除的元素位置。例如:

cpp 复制代码
#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中的元素,下标越界会抛出异常。例如:

cpp 复制代码
#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中的第一个元素。例如:

cpp 复制代码
#include <iostream>
#include <vector>

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

3.back()函数

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

cpp 复制代码
#include <iostream>
#include <vector>

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

(四)数组查找函数🔎

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

cpp 复制代码
#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对象赋值给另一个。例如:

cpp 复制代码
#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模拟加法效果。如下:

cpp 复制代码
#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中的单个元素。例如:

cpp 复制代码
#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】

相关推荐
沐欣工作室_lvyiyi几秒前
家庭水资源节能系统设计(论文+源码)
c++·python·云平台·单片机毕业设计·单片机仿真·电子信息工程毕业设计·机械电子工程
神仙别闹2 分钟前
基于C语言实现 TINY+ 编译器
c语言·开发语言·数据库
Wang's Blog6 分钟前
Java 项目实战: 外卖平台优化-从库Slave配置与主从复制验证
java·开发语言
yi01115 分钟前
LeetCode 134 加油站:从 双循环暴力 演变到 贪心
linux·算法·leetcode
Yyyyyy~16 分钟前
[c++]数组
c++
知识分享小能手23 分钟前
C++ 学习教程,从入门到精通,C++内存模型和名称空间 — 详细知识点总结(9)
开发语言·c++·学习
sogw-三叶草️27 分钟前
LeetCode 989. 数组形式的整数加法
数据结构·算法
2601_9622186131 分钟前
c++中多重继承与虚继承的实现
开发语言·c++
沫璃染墨41 分钟前
《Qt从零入门系列(十一):Qt事件机制详解——从QEvent到鼠标、键盘与定时器事件》
c++·qt·ui·硬件工程·交互·个人开发·qt5
我是小白呀1 小时前
17-企业Workflow引擎怎么选:定时、队列、n8n、Temporal与Camunda
java·开发语言·人工智能·dubbo·workflow