leetcode 上刷题的时候,vector 是最常用的容器,记录一下用法。
初始化
// 空数组
vector<int> array;
// 长度为 10 的数组
vector<int> array(10);
// 长度为 10 的数组,每个元素初始值为 1
vector<int> array(10, 1);
// 长度为 3 的数组,花括号内为元素值
vector<int> array{
1, 2, 3};
// 先声明,后初始化
vector<int> array;
array = vector<int>(10, 1);
// 复制另一个数组
vector<int> array(10, 0);
vector<int> array2(array);
// 直接使用或作为返回值
vector<vector<int>> martix;
martix.push_back(vector<int>{
1, 2});
return vector<int>{
1, 2};
// 初始化二维数组
vector<vector<int>> dp(m, vector<int>(n, 0));
遍历
// 索引遍历
int len = array.size()
for (int i = 0; i < len; i++) {
// ...
}
// 复制传值
for (int i : array) {
// ...
}
// 引用传值,速度更快,尤其当元素所占空间很大时。
for (const int& i : array) {
//...
}
vector 完全可以当作栈来使用,push_back 与 pop_back
排序
// 默认升序
sort(array.begin(), array.end());
// greater 表示降序
sort(array.begin(), array.end(), greater<int>());
// 自定义,强烈建议使用地址符 &,省得参数传入时复制导致速度慢
// 小于号,升序
static bool comp(T& a, T& b) {
return a < b;
}
sort(array.begin(), array.end(), comp);
删除元素
函数 | 功能 |
---|---|
erase(pos) | 删除 vector 容器中 pos 迭代器指定位置处的元素,并返回指向被删除元素下一个位置元素的迭代器。该容器的大小(size)会减 1 |
erase(begin, end) | 删除 vector 容器中迭代器 [begin, end) 内的元素,并返回指向被删除区域下一个位置元素的迭代器。该容器的大小(size)会相应减少 |
remove(begin, end, target) | 不是vector的类内函数,可以删除 vector 容器中和 target 相等的所有元素,返回新的结尾迭代器,size不会变化。该函数不常用 |
remove的实质不是删除,而是把 target 后的元素前移,这里举个例子:
vector<int> array {
1, 2, 1, 3, 4, 5};
auto newend = remove(array.begin(), array.end(), 1);
// 删除过程
// 1 2 1 3 4 5
// 2 2 1 3 4 5 (2 覆盖第一个 1)
// 2 3 4 5 4 5 (3 4 5 覆盖前面的 2 1)
// newend 指向第二个 4
// 2 3 4 5
for (auto it = array.begin(); it != newend; it++) {
cout << *it << endl;
}
// 2 3 4 5 4 5
for (auto it = array.begin(); it != array.end(); it++) {
cout << *it << endl;
}
因此,remove 需要搭配 erase 才能完全删除元素
// 2 3 4 5
array.erase(remove(array.begin(), array.end(), 1), array.end());
有序数组原地去重
// array 是有序数组
auto it = array.begin();
while(it != array.end()) {
if (it > array.begin() && *it == *(it-1)) {
it = array.erase(it);
}
else {
it++;
}
}