梳理一下 vector 的常见用法。
C++ 的 vector 本质上是一个动态数组,也就是可以自动扩容的数组,具体如何实现这里不深究。如果要使用 vector,需要添加 vector 头文件。
初始化
vector 的初始化有很多种方式(本质上就是如何如何使用 vector 提供的构造函数):1
2
3
4
5
6
7
8
9
10
11
12vector<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
4vector<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
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
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
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
2vector<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);