Vector
1. 定义:
vector<typename> name;
相当于定义一个一维数组 name[SIZE],只不过其长度可以根据需要进行变化,就是 “变长数组”,示例如下:
vector<int> name;
vector<double> name;
vector<char> name;
vector<node> name; // node是结构体类型
//如果 typename 是 vector:
vector<vector<int> > name;
vector 数组的定义:
vector<int> vi[100];
vi[0] ~ vi[99] 中每一个都是 vector 容器,这种写法的一维长度已经固定为 arraySize,另一维才是 “变长”。
2. Vector 容器内元素的访问
(1) 通过 下标 访问
对于 vector<typename> vi; 的 vector 容器来说,直接访问 vi[index] 即可
(2) 通过 迭代器 访问
迭代器可以理解为一种类似 指针 的东西,定义如下:
vector<typename>::iterator it;
// typename 为 int 和 double 的举例:
vector<int>::iterator it;
vector<double>::iterator it;
通过 *it 访问 vector 里的元素
示例,通过类似下标和指针访问数组的方式来访问容器内的元素:
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i); // push_back(i) 在 vi 的末尾添加元素 i,即依次添加 1,2,3,4,5
}
// vi.begin() 为取 vi 的首元素的地址,而 it 指向这个地址
vector<int>::iterator it = vi.begin();
for(int i = 0; i < 5; i++){
printf("%d ", *(it + i)); // 输出 vi[i]
}
return 0;
}
迭代器还实现了两种 自加操作:++it 和 it++(自减操作同理),有了另一种 遍历 vector 中元素的写法:
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
// vector 的迭代器不支持 it < vi.end() 写法,因此循环条件只能用 it != vi.end()
for(vector<int>::iterator it = vi.begin(); it != vi.end(); it++){
printf("%d ", *it);
}
return 0;
}
3. vector 常用函数
(1)push_back()
push_back(x) 就是在 vector 后面添加一个元素 x
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
for(int i = 0; i < vi.size(); i++){
printf("%d ", vi[i]);
}
return 0;
}
(2)pop_back
删除 vector 的尾元素
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
vi.pop_back();
for(int i = 0; i < vi.size(); i++){
printf("%d ", vi[i]);
}
return 0;
}
(3)size()
获得 vector 中元素的个数,返回 unsigned 类型
(4)clear()
清空 vector 中的所有元素
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i = 1; i < 5; i++){
vi.push_back(i);
}
vi.clear();
printf("%d", vi.size());
return 0;
}
(5)insert()
insert(it, x) 用来向 vector 的任意迭代器 it 处插入一个元素 x
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
vi.insert(vi.begin() + 2, -1); // 将 -1 插入到 vi[2] 的位置
for(int i = 0; i < vi.size(); i++){
printf("%d", vi[i]);
}
return 0;
}
(6)erase()
① 删除 单个 元素:erase(it) 即为删除 迭代器为 it 处的元素
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i = 1; i <= 5; i++){
vi.push_back(i);
}
// 删除 4
vi.erase(vi.begin()+3);
for(int i = 0; i < vi.size(); i++){
printf("%d ", vi[i]);
}
return 0;
}
② 删除一个区间内的所有元素:erase(first, last) 即删除 [first, last) 内所有的元素
4. vector 的常见用途
(1)储存数据
① vector 本身可以作为数组使用,而且在一些 元素个数不确定 的场合可以很好地节省空间
② 更方便的处理 最后一个满足条件的数据后面不输出额外的空格,可以先用 vector 记录所有需要输出的数据,然后输出。
(2)用 邻接表 存储 图
——摘抄自《算法笔记》