梳理一下 vector 的常见用法。
C++ 的 vector 本质上是一个动态数组,也就是可以自动扩容的数组,具体如何实现这里不深究。如果要使用 vector,需要添加 vector 头文件。
初始化
vector 的初始化有很多种方式(本质上就是如何如何使用 vector 提供的构造函数):
1 | vector<int> v1; // v1 是一个空 vector,内部元素都是 int 类型的 |
上面的int都可以换成其他基本类型、类或容器。
访问
下标
vector 访问元素的方式有很多,可以用类似数组下标的方式访问,此时下标范围是[0, v.size() - 1]。
1 | vector<int> v(5); |
迭代器
STL 容器都可以用迭代器来访问。
1 |
|
除了迭代器与下标,vector 还可以用一些成员函数来访问。
运算符
两个 vector 可以直接用==和!=来判断相同与否,也即其内部元素是否都一致。
1 |
|
类似的运算符还有<、<=、>和>=,比较规则是内部元素的字典序。
常用函数
push_back
向 vector 容器末尾添加元素。
1 | v.push_back(x); |
emplace_back
C++ 11 引入的新函数,与 push_back 相比更高效,用法基本相同。因为 push_back 只能接受一个元素,如果传入不是一个基础数据类型,那么就需要先将对象构造好,push_back 才会将这个对象传入 vector 中。
1 |
|
pop_back
删除 vector 容器内末尾元素。
1 | v.pop_back(); |
clear
清除 vector 容器内所有元素。
1 | v.clear(); |
resize
重新设置 vector 容器的大小。
1 | vector<int> v(2); |
注意,resize 函数不会真的改变当前容器的大小,只是将记录当前容器大小的那个变量改成重新设置的大小。
size
size 函数返回容器的大小,在未设置大小的情况下,返回容器内元素的个数。
1 | v.size(); |
begin
返回 vector 第一个元素的迭代器。
1 | v.begin(); |
end
返回越界后的第一个位置的迭代器。
1 | v.end(); |
rbegin
返回 vector 容器逆序后的第一个元素的迭代器,也就是原序列的最后一个元素。
1 | v.rbegin(); |
rend
返回 vector 容器逆序后,越界的第一个位置的迭代器,也就是原序列第一个元素的前一个位置。
1 | v.end(); |
注意:rbegin 和 rend 函数返回的迭代器都是反向迭代器,++运算符是向前迭代,--运算符是向后迭代,这与正向迭代器是不同的!
所以,如果需要对 vector 降序排序,可以直接写成sort(v.rbegin(), v.rend());。
front
front 函数返回 vector 第一个元素的值。
1 | v.front(); |
back
back 函数返回 vector 最后一个元素的值。
1 | v.back(); |
insert
向任意迭代器位置插入元素。
1 | v.insert(it, val); |
注意,迭代器 it 必须是 v 内的。
erase
删除迭代器为 it 的元素。
1 | v.erase(it); |
删除迭代器区间[first, last)内的所有元素。
1 | v.erase(first, last); |