C++_vector 容器的常见用法

梳理一下 vector 的常见用法。

C++ 的 vector 本质上是一个动态数组,也就是可以自动扩容的数组,具体如何实现这里不深究。如果要使用 vector,需要添加 vector 头文件。

初始化

vector 的初始化有很多种方式(本质上就是如何如何使用 vector 提供的构造函数):

1
2
3
4
5
6
7
8
9
10
11
12
vector<int> v1;  // v1 是一个空 vector,内部元素都是 int 类型的
vector<int> v2(v1); // v2 中包含了 v1 所有元素的副本
vector<int> v2 = v1; // 同上
vector<int> v3(size, val); // v3 是大小为 size,内部元素全是 val 的 vector
vector<int> v4(size); // v4 的大小是 size,内部元素全是 0
vector<int> v5{a, b, c, ...} // v5 包含了初始值个数的元素,前几个元素被赋予相应的值
vector<int> v5={a, b, c, ...} // 同上
vector<int> v6[size] // v6 的大小为 size,内部每一个元素都是单独的 vector,长度不限
vector<vector<int>> v6(size) //同上
vector<int> v7(v1.begin(), v1.begin() + k); // v7的大小为 k,内部元素顺序与 v1 的前 k个元素一致
vector<vector<int>> v7; // 不限定长度的二维 vector
vector<vector<int>> v8(size, vector<int>(size)); // 同时限定一维和二维的大小

上面的int都可以换成其他基本类型、类或容器。

访问

下标

vector 访问元素的方式有很多,可以用类似数组下标的方式访问,此时下标范围是[0, v.size() - 1]

1
2
3
4
vector<int> v(5);
v[0] = 0;
v[1] = 1;
v[2] = 2;

迭代器

STL 容器都可以用迭代器来访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <bits/stdc++.h> 
using namespace std;
int main() {
vector<int> v{1, 2, 3, 4, 5};
auto it = v.begin();
cout << *it << endl;
cout << *(++it) << endl;
cout << *(v.begin() + 1) << endl;
return 0;
}
/*
out:
1
2
2
*/

除了迭代器与下标,vector 还可以用一些成员函数来访问。

运算符

两个 vector 可以直接用==!=来判断相同与否,也即其内部元素是否都一致。

1
2
3
4
5
6
7
8
9
10
11
12
#include <bits/stdc++.h> 
using namespace std;
int main() {
vector<int> v1{1, 2, 3};
vector<int> v2{1, 2, 3};
if(v1 == v2) cout << "Same" << endl;
return 0;
}
/*
out:
Same
*/

类似的运算符还有<<=>>=,比较规则是内部元素的字典序。

常用函数

push_back

向 vector 容器末尾添加元素。

1
v.push_back(x);

emplace_back

C++ 11 引入的新函数,与 push_back 相比更高效,用法基本相同。因为 push_back 只能接受一个元素,如果传入不是一个基础数据类型,那么就需要先将对象构造好,push_back 才会将这个对象传入 vector 中。

1
2
3
4
5
6
7
8
#include <bits/stdc++.h> 
using namespace std;
int main() {
vector<pair<int, int>> v;
v.push_back(make_pair(1, 2));
v.emplace_back(1, 2);
return 0;
}

pop_back

删除 vector 容器内末尾元素。

1
v.pop_back();

clear

清除 vector 容器内所有元素。

1
v.clear();

resize

重新设置 vector 容器的大小。

1
2
vector<int> v(2);
v.resize(5);

注意,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);


Buy me a coffee ? :)
0%