vector 是 STL 提供的 内存连续的 、 可变长度 的数组(亦称列表或向量)数据结构。能够提供线性复杂度的插入和删除,以及常数复杂度的随机访问。
特性
动态分配内存
很多时候我们不能提前开好那么大的空间。尽管我们能知道数据总量在空间允许的级别,但是单份数据还可能非常大,这种时候我们就需要 vector 来把内存占用量控制在合适的范围内。 vector 还支持动态扩容,在内存非常紧张的时候这个特性就能派上用场了。
构造函数
// 创建空 vectorvector<int> v1;// 创建一个初始长度为 3 的 vector,元素默认值为 0vector<int> v2(3);// 创建一个初始长度为 3 的 vector,元素默认值为 2vector<int> v3(3, 2);// C++11 初始化列表vector<int> v4{1, 2, 3, 4};// 拷贝构造vector<int> v5(v4);// 拷贝 v4 的部分内容,也就是 {2, 3}vector<int> v6(v4.begin() + 1, v4.begin() + 3);
成员函数
元素访问
at()访问指定的元素,同时进行越界检查,越界则抛出异常。operator[]重载了[],可以像普通数组一样通过v[index]访问。front()返回第一个元素的值。back()返回最后一个元素的值。data()返回指向内存中数组第一个元素的指针。
迭代器
begin()返回指向起始的迭代器。end()返回指向末尾的迭代器。rbegin()返回指向起始的逆向迭代器。rend()返回指向末尾的逆向迭代器。
容量
empty()检查容器是否为空。size()返回容纳的元素数。max_size()返回容器大小的理论极限,这个值通常会受内存限制。reserve()预先申请存储空间。(修改capacity)capacity()返回当前存储空间能够容纳的元素数。shrink_to_fit()释放未使用的内存减少内存的使用(减小capacity到size)
修改
clear()清空内容。insert()插入元素。emplace()原位构造元素。(可以理解为更高效的插入)erase()删除元素。push_back()将元素添加到容器末尾。emplace_back()在容器末尾就地构造元素。pop_back()移除末元素。resize()改变容器中可存储元素的个数。(修改size)swap()交换内容。
二维vector(存储整型)
二维vector可以看做vector里面存储的每个元素类型是vector
初始化
初始化一个5行3列的二维vector
#include <bits/stdc++.h>using namespace std;int main(){int row = 5;int col = 3;vector<vector<int>> v(row,vector<int>(3,0));system("pause");return 0;}
获取行数/列数
vector<vector<int>> v(row,vector<int>(3,0));v.size(); // 行数v[0].size(); // 列数
遍历
普通for-i循环
#include <bits/stdc++.h>using namespace std;int main(){int row = 5;int col = 3;vector<vector<int>> v(row,vector<int>(3,0));for(int i = 0;i < row;i++){for(int j = 0;j < col;j++){cout << v[i][j] << " ";}cout << endl;}system("pause");return 0;}
增强for循环
#include <bits/stdc++.h>using namespace std;int main(){int row = 5;int col = 3;vector<vector<int>> v(row,vector<int>(3,0));for(auto r : v){for(auto c : r){cout << c << " ";}cout << endl;}system("pause");return 0;}
迭代器
#include <bits/stdc++.h>using namespace std;int main(){int row = 5;int col = 3;vector<vector<int>> v(row,vector<int>(3,0));vector<vector<int>>::iterator row_it;vector<int>::iterator col_it;for(row_it = v.begin();row_it < v.end();row_it++){for(col_it = (*row_it).begin();col_it < (*row_it).end();col_it++){cout << (*col_it) << " ";}cout << endl;}system("pause");return 0;}
