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()交换内容。
示例代码
动态分配内存
#include <iostream>#include <vector>using namespace std;int main() {vector<int> v;for (int i = 0; i < 20; ++i) {v.push_back(i);cout << "size = " << v.size()<< ",\tcapacity = " << v.capacity()<< endl;}return 0;}
杨辉三角
#include <iostream>#include <vector>using namespace std;int main() {vector<int> v;int n;cin >> n;for (int i = 0; i < n; ++i) {v.push_back(1);for (int j = i - 1; j > 0; --j) {v[j] += v[j - 1];}for (int num : v) {cout << num << ' ';}cout << endl;}return 0;}
