?快来参与讨论?,点赞?、收藏⭐、分享?,共创活力社区。 ?
如果你对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_back | 在vector 的末尾添加一个元素➕ |
pop_back | 从vector 的末尾删除一个元素➖ |
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】