vector 是 STL 提供的 内存连续的 、 可变长度 的数组(亦称列表或向量)数据结构。能够提供线性复杂度的插入和删除,以及常数复杂度的随机访问。
特性
动态分配内存
很多时候我们不能提前开好那么大的空间。尽管我们能知道数据总量在空间允许的级别,但是单份数据还可能非常大,这种时候我们就需要 vector 来把内存占用量控制在合适的范围内。 vector 还支持动态扩容,在内存非常紧张的时候这个特性就能派上用场了。
构造函数
// 创建空 vector
vector<int> v1;
// 创建一个初始长度为 3 的 vector,元素默认值为 0
vector<int> v2(3);
// 创建一个初始长度为 3 的 vector,元素默认值为 2
vector<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;
}