标准库类型vector
2023年12月14日 2023年12月21日
类模板
存放某种给定类型的对象的可变长的序列
对象的集合,其中所有对象的类型都相同
集合中的每个对象都有一个与之对应的索引,索引用于访问对象
容器
如vector,因为其包含其他对象,所以称作容器
头文件和命名空间
1#include <vector> 2using std::vector;
构造函数
1vector<int> v; 2 3vector<vector<int> > vv; 4vector<vector<int>> vv2;
早期需要加空格
- | |
---|---|
vector<T> v1 | 无元素 |
vector<T> v1 = {} | |
vector<T> v2(v1) | 类型必须相同 |
vector<T> v2 = v1 | 类型必须相同 |
vector<T> v3(n, val) | 显式构造函数; 包含n个重复的元素,每个元素都是val的拷贝;创建指定个数的元素 |
vector<T> v4(n) | 显式构造函数; 包含n个元素,对元素进行值初始化 |
vector<T> v5{a, b, c} | v5包含了若干个元素,且给出了这些元素的初始值;要求a,b,c的类型为T |
vector<T> v5 = {a, b, c} |
添加元素
-
向vector对象中添加元素
1v1.push_back(i);
-
vector对象能高效增长
C++标准要求vector应该能在运行时高效快速地添加元素因此,初始化时若设置vector对象的大小,添加元素时反而会受限于此,除非设置所有元素的初始值相同(?)
-
不能在范围for循环中向vector对象添加元素
选择向vector对象添加元素的迭代语句时,使用for要注意 -
任何一种可能改变vector对象容量的操作,如push_back,都会使vector对象的迭代器失效
凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素
1vector<int> v; 2for (int i = 0; i != 100; ++i) 3{ 4 v.push_back(i); 5} 6 7string word; 8vector<string> text; 9while (cin >> word) 10{ 11 text.push_back(word); 12}
操作: 返回元素个数
- | |
---|---|
vector<T>::size_type | v.size()的返回类型; v[n]索引的类型 |
1v.size();
其他操作
- | |
---|---|
v.empty() | |
v.begin() | |
v.end() | |
v.push_back(t) | 向vector对象的末尾添加元素 |
v[n] | 用于访问已存在的元素,而不能用于添加元素;只能对确知已存在的元素执行下标访问;其他容器可以通过下标添加元素 |
v1 = v2 | 拷贝替换 |
v1 = {a, b, c} | 拷贝替换 |
只有当元素的值可比较时,vector对象才能被比较
- | |
---|---|
v1 == v2 | 要求元素可判等;要求元素类型相同,对应位置的元素相同(数量相同) |
v1 != v2 |
<, <=, >, >=
1v1 = {1, 2, 3, 4, 5}; 2v2 = {1, 2, 3}; 3v3 = {1, 5};
v1 > v2:相同位置元素相同,但v1元素较多,v1较大
v1 < v3,v2 < v3:相同位置元素不同,结果由单个元素的比较结果决定
遍历vector对象中的元素
1vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9}; 2 3for (auto &i : v) 4{ 5 // Process 6} 7 8for (auto i : v) 9{ 10 // Process 11}