前言:在上一篇中我们讲到了string类的模拟实现,今天我们将进一步的去学习vector的一些常用的使用方法。
💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
目录标题
- 什么是vector
- vector的使用
- vector构造函数的使用
- vector常见函数的使用
- 迭代器的使用
- rebegin()和rend()函数
- push_back():在向量的末尾添加一个元素
- pop_back():删除向量的最后一个元素
- size():返回向量中元素的个数
- empty():检查向量是否为空,如果为空则返回 true,否则返回 false
- capacity()
- clear():清空向量中的所有元素
- front():返回向量的第一个元素
- back():返回向量的最后一个元素
- insert():在指定位置插入一个或多个元素
- erase():删除指定位置或指定范围的元素
- resize():调整向量的大小
- swap():交换两个向量的内容
- vector中operator[]
- vector中嵌套vector的二维矩阵或多维数组
什么是vector
在C++中,vector是一种动态数组容器,可以存储一系列具有相同数据类型的元素。它提供了一些操作函数,如插入、删除、访问等,使得对数组进行操作更加方便和灵活。
与普通的数组相比,vector具有以下优点:
- 可以在运行时动态调整大小,不需要事先指定大小;
- 可以自动处理内存分配和释放,减少手动管理内存的工作量;
- 提供了更多的操作函数,如插入、删除、查找等;
- 可以通过下标访问元素。
vector的使用
vector构造函数的使用
- 默认构造函数
vector<int> vec; // 创建一个空的整数向量
- 带有初始值的构造函数:
int main()
{
//vector<int> vec; // 创建一个空的整数向量
int n = 0,value = 0;
cout << "输入元素个数" << endl;
cin >> n;
vector<int> vec(n); // 创建一个包含 n 个默认初始化的整数元素的向量
for (auto e : vec)//遍历容器中的值
{
cout << e << " ";
}
cout << endl;
cout << "输入元素的值" << endl;
cin >> value;
vector<int> vec1(n, value); // 创建一个包含 n 个值为 value 的整数元素的向量
for (auto e : vec1)//遍历容器中的值
{
cout << e << " ";
}
cout << endl;
return 0;
}
- 复制构造函数
int main()
{
vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 创建一个包含初始元素的向量
vector<int> vec2(vec1); // 使用 vec1 的副本创建向量 vec2
for (auto s : vec2)
{
cout << s << " ";
}
cout << endl;
return 0;
}
4. 列表初始化 (C++11 及以上版本)
int main()
{
vector<int> vec4{ 1, 2, 3, 4, 5 }; // 使用列表初始化创建向量 vec4
for (auto s : vec4)
{
cout << s << " ";
}
return 0;
}
- 区间构造函数
int main()
{
vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 创建一个包含初始元素的向量
vector<int> vec2(vec1); // 使用 vec1 的副本创建向量 vec2
for (auto s : vec2)
{
cout << s << " ";
}
cout << endl;
vector<int> vec3(vec1.begin(), vec1.end()); // 使用迭代器指定区间来创建向量 vec3
for (auto s : vec3)
{
cout << s << " ";
}
return 0;
}
vector常见函数的使用
迭代器的使用
在C++中,vector类提供了**begin()和end()**成员函数来获取指向容器中第一个元素和最后一个元素之后位置的迭代器。
调用begin()函数会返回一个指向容器中第一个元素的迭代器。调用end()函数会返回一个指向容器中最后一个元素之后位置的迭代器。
int main()
{
std::vector<int> vec = { 1, 2, 3, 4, 5 };
// 使用begin()函数获取指向第一个元素的迭代器
std::vector<int>::iterator it_begin = vec.begin();
// 使用end()函数获取指向最后一个元素之后位置的迭代器
std::vector<int>::iterator it_end = vec.end();
// 使用迭代器遍历vector并输出所有元素
for (std::vector<int>::iterator it = it_begin; it != it_end; ++it)
{
std::cout << *it << " ";
}
return 0;
}
rebegin()和rend()函数
在使用vector
中的rbegin()
和rend()
函数时,请按照以下步骤进行操作:
- 在代码中包含
<vector>
头文件。 - 创建一个
vector
对象并向其中添加元素。 - 使用
rbegin()
函数获取指向向量最后一个元素的迭代器。 - 使用
rend()
函数获取指向向量中第一个元素之前位置的迭代器。 - 使用循环以逆序的方式遍历向量,从
rbegin()
函数返回的迭代器开始,到rend()
函数返回的迭代器结束。
下面是一个示例来说明用法:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVec = {1, 2, 3, 4, 5};
// 以逆序的方式遍历向量
for (auto it = myVec.rbegin(); it != myVec.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
输出结果:
5 4 3 2 1
在这个例子中,我们创建了一个名为myVec
的vector
对象,并用一些整数值进行了初始化。然后,我们使用for
循环和一个逆序迭代器(rbegin()
函数)和一个普通迭代器(rend()
函数)来以逆序的方式打印向量的元素。
push_back():在向量的末尾添加一个元素
int main()
{
vector<int> vec;
vec.push_back(10); // 向 vec 中添加元素 10
vec.push_back(20); // 向 vec 中添加元素 20
vec.push_back(20); // 向 vec 中添加元素 20
vec.push_back(0); // 向 vec 中添加元素 20
for (auto e : vec)
{
cout << e << " ";
}
cout << endl;
return 0;
}
pop_back():删除向量的最后一个元素
int main()
{
vector<int> vec = { 10, 20, 30,40,50 };
cout << "删除前" << endl;
for (auto e : vec)
{
cout << e << " ";
}
cout << endl;
cout << "删除后" << endl;
vec.pop_back(); // 删除 vec 的最后一个元素
for (auto e : vec)
{
cout << e << " ";
}
cout << endl;
return 0;
}
size():返回向量中元素的个数
int main()
{
vector<int> vec = { 10, 20, 30 };
cout <<"该容器的元素个数是: " << vec.size() << endl;
return 0;
}
empty():检查向量是否为空,如果为空则返回 true,否则返回 false
int main()
{
vector<int> vec = { 1,2 };
bool isEmpty = vec.empty(); // 返回 true,因为 vec 是空的
if (isEmpty)
{
cout << "该容器是空的" << endl;
}
else
{
cout << "该容器不是空的" << endl;
}
return 0;
}
capacity()
在使用vector
的capacity()
函数时,它返回的是vector
当前分配的内存容量大小,即可以容纳的元素数量。以下是使用capacity()
函数的几个常见情况:
- 获取
vector
的容量:使用capacity()
函数可以获取当前vector
的容量。
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVec;
std::cout << "Vector capacity: " << myVec.capacity() << std::endl;
return 0;
}
输出结果:
Vector capacity: 0
在这个例子中,我们创建了一个名为myVec
的空vector
对象,并使用capacity()
函数获取其容量。由于vector
是空的,所以容量为0。
- 预分配容量:有时候可以使用
reserve()
函数来预分配vector
的容量,以减少不必要的重新分配的次数。
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVec;
myVec.reserve(10); // 预分配10个元素的容量
std::cout << "Vector capacity: " << myVec.capacity() << std::endl;
return 0;
}
输出结果:
Vector capacity: 10
在这个例子中,我们使用reserve()
函数预分配了10个元素的容量,然后使用capacity()
函数获取当前容量。
- 动态调整容量:
vector
会根据需要自动调整容量,以适应元素的添加和删除。当vector
的元素数量超过当前容量时,会自动增加容量以容纳更多元素。
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVec;
std::cout << "Initial capacity: " << myVec.capacity() << std::endl;
for (int i = 0; i < 10; ++i) {
myVec.push_back(i);
std::cout << "Vector capacity after adding " << i << ": " << myVec.capacity() << std::endl;
}
return 0;
}
输出结果:
Initial capacity: 0
Vector capacity after adding 0: 1
Vector capacity after adding 1: 2
Vector capacity after adding 2: 4
Vector capacity after adding 3: 4
Vector capacity after adding 4: 8
Vector capacity after adding 5: 8
Vector capacity after adding 6: 8
Vector capacity after adding 7: 8
Vector capacity after adding 8: 16
Vector capacity after adding 9: 16
在这个例子中,我们创建了一个名为myVec
的空vector
对象,并使用capacity()
函数获取初始容量。然后,我们使用push_back()
函数向vector
添加元素,并使用capacity()
函数获取每次添加元素后的容量。可以看到,当元素数量超过当前容量时,vector
会动态调整容量以容纳更多元素,容量的增长规律可能是指数级的(取决于编译器)。
clear():清空向量中的所有元素
int main()
{
vector<int> vec = { 10, 20, 30 };
cout << "清空前" << endl;
for (auto e : vec)
{
cout << e << " ";
}
cout << endl;
cout <<"该容器的元素个数是:" << vec.size() << endl;//查看容器中元素个数
vec.clear(); // 清空 vec 中的所有元素
cout << "清空后" << endl;
for (auto e : vec)
{
cout << e << " ";
}
cout << endl;
cout << "该容器的元素个数是:" << vec.size() << endl;//查看容器中元素个数
return 0;
}
front():返回向量的第一个元素
int main()
{
vector<int> vec = { 10, 20, 30 };
int firstElement = vec.front(); // 返回 10
cout << firstElement << endl;
return 0;
}
back():返回向量的最后一个元素
int main()
{
vector<int> vec = { 10, 20, 30 };
int lastElement = vec.back(); // 返回 30
cout << lastElement << endl;
return 0;
}
insert():在指定位置插入一个或多个元素
int main()
{
vector<int> vec = { 10, 20, 30 };
vec.insert(vec.begin() + 1, 15); // 在索引为 1 的位置插入元素 15,vec 变为 {10, 15, 20, 30}
for (auto e: vec)
{
cout << e << " ";
}
return 0;
}
erase():删除指定位置或指定范围的元素
int main()
{
vector<int> vec = { 10, 20, 30 ,40, 50};
vec.erase(vec.begin() + 1);
vec.erase(vec.begin(), vec.begin() + 2);
for (auto e: vec)
{
cout << e << " ";
}
cout << endl;
return 0;
}
resize():调整向量的大小
int main()
{
vector<int> vec = { 10, 20, 30 };
vec.resize(5); // 将 vec 调整为包含 5 个元素,未指定的元素将被默认初始化
for (auto e: vec)
{
cout << e << " ";
}
cout << endl;
vector<int> vec1 = { 10, 20, 30 };
vec1.resize(10, 9);//将vec1调整成10个元素,未被指定的元素 初始化成9
for (auto e : vec1)
{
cout << e << " ";
}
cout << endl;
return 0;
}
swap():交换两个向量的内容
int main()
{
vector<int> vec1 = { 10, 20 };
vector<int> vec2 = { 30, 40 };
cout << "交换前" << endl;
for (auto e : vec1)
{
cout << e << " ";
}
vec1.swap(vec2); // 交换 vec1 和 vec2 的元素,vec1 变为 {30, 40},vec2 变为 {10, 20}
cout << endl;
cout << "交换后" << endl;
for (auto e : vec1)
{
cout << e << " ";
}
}
vector中operator[]
在C++的vector
中,operator[]
是用于访问并操作vector
中的元素的重载运算符。它允许您使用索引来访问和修改vector
中的特定元素。以下是对operator[]
的使用示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVec = {1, 2, 3, 4, 5};
// 通过使用索引来访问和修改元素
std::cout << "Element at index 2: " << myVec[2] << std::endl;
myVec[3] = 10;
std::cout << "Modified element at index 3: " << myVec[3] << std::endl;
return 0;
}
输出结果:
Element at index 2: 3
Modified element at index 3: 10
在这个例子中,我们创建了一个名为myVec
的vector
对象,并使用初始化列表初始化其元素。然后,我们使用operator[]
来访问索引为2和3的元素,并分别输出它们的值。接下来,我们将索引为3的元素修改为10,并再次使用operator[]
访问并输出修改后的值。
需要注意的是,operator[]
没有边界检查,如果使用超出vector
有效索引范围的索引进行访问,会导致未定义的行为。因此,在使用operator[]
时,务必确保所使用的索引在vector
的有效范围内。
此外,还可以将operator[]
用于循环遍历vector
中的元素:
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVec = {1, 2, 3, 4, 5};
// 使用operator[]遍历vector中的元素
for (size_t i = 0; i < myVec.size(); ++i) {
std::cout << "Element at index " << i << ": " << myVec[i] << std::endl;
}
return 0;
}
输出结果:
Element at index 0: 1
Element at index 1: 2
Element at index 2: 3
Element at index 3: 4
Element at index 4: 5
在这个例子中,我们使用operator[]
在循环中遍历vector
中的元素。通过递增索引变量i
,我们可以依次访问vector
中的元素,并输出它们的索引和值。
vector中嵌套vector的二维矩阵或多维数组
在C++中,可以使用vector嵌套vector来创建二维矩阵或多维数组。这种嵌套的vector可以用于存储和访问多个行和列的数据。
int main() {
// 定义数组的大小
int rows = 3;
int cols = 4;
// 创建一个二维vector
std::vector<std::vector<int>> matrix(rows, std::vector<int>(cols));
// 对二维vector进行赋值
int count = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = count++;
}
}
// 打印二维vector的内容
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
好啦,今天的内容就到这里啦,下期内容预告vector的常见函数模拟实现,博主前段时间有点事情,后面这段时间会加班加点的更新!
结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。