[C++] vector 用法

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++;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43742643/article/details/128576927