【C++】vector常见的使用方式

卫卫周大胖; 2024-06-24 11:05:12 阅读 90

前言:在上一篇中我们讲到了string类的模拟实现,今天我们将进一步的去学习vector的一些常用的使用方法。

💖 博主CSDN主页:卫卫卫的个人主页 💞

👉 专栏分类:高质量C++学习 👈

💯代码仓库:卫卫周大胖的学习日记💫

💪关注博主和博主一起学习!一起努力!

在这里插入图片描述


目录标题

什么是vectorvector的使用vector构造函数的使用vector常见函数的使用迭代器的使用rebegin()和rend()函数push_back():在向量的末尾添加一个元素pop_back():删除向量的最后一个元素size():返回向量中元素的个数empty():检查向量是否为空,如果为空则返回 true,否则返回 falsecapacity()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 的副本创建向量 vec2for (auto s : vec2){ cout << s << " ";}cout << endl;return 0;}

在这里插入图片描述

4. 列表初始化 (C++11 及以上版本)

int main(){ vector<int> vec4{ 1, 2, 3, 4, 5 }; // 使用列表初始化创建向量 vec4for (auto s : vec4){ cout << s << " ";}return 0;}

在这里插入图片描述

区间构造函数

int main(){ vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 创建一个包含初始元素的向量vector<int> vec2(vec1); // 使用 vec1 的副本创建向量 vec2for (auto s : vec2){ cout << s << " ";}cout << endl;vector<int> vec3(vec1.begin(), vec1.end()); // 使用迭代器指定区间来创建向量 vec3for (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

在这个例子中,我们创建了一个名为myVecvector对象,并用一些整数值进行了初始化。然后,我们使用for循环和一个逆序迭代器(rbegin()函数)和一个普通迭代器(rend()函数)来以逆序的方式打印向量的元素。

push_back():在向量的末尾添加一个元素

int main(){ vector<int> vec;vec.push_back(10); // 向 vec 中添加元素 10vec.push_back(20); // 向 vec 中添加元素 20vec.push_back(20); // 向 vec 中添加元素 20vec.push_back(0); // 向 vec 中添加元素 20for (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()

在使用vectorcapacity()函数时,它返回的是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: 0Vector capacity after adding 0: 1Vector capacity after adding 1: 2Vector capacity after adding 2: 4Vector capacity after adding 3: 4Vector capacity after adding 4: 8Vector capacity after adding 5: 8Vector capacity after adding 6: 8Vector capacity after adding 7: 8Vector capacity after adding 8: 16Vector 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(); // 返回 10cout << firstElement << endl;return 0;}

在这里插入图片描述


back():返回向量的最后一个元素

int main(){ vector<int> vec = { 10, 20, 30 };int lastElement = vec.back(); // 返回 30cout << 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个元素,未被指定的元素 初始化成9for (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: 3Modified element at index 3: 10

在这个例子中,我们创建了一个名为myVecvector对象,并使用初始化列表初始化其元素。然后,我们使用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: 1Element at index 1: 2Element at index 2: 3Element at index 3: 4Element 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的常见函数模拟实现,博主前段时间有点事情,后面这段时间会加班加点的更新!


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🌏🗺️ 这里祝各位接下来的每一天好运连连 💞💞


声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。