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 完全可以当作栈来使用,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++;}
}