平时会遇到只用普通数组会超内存的情况,这时用vector会简便许多
使用vector要加的头文件
#include<vector>
using namespace std;
1、vector的定义
vector<typename>name;
此定义相当于一堆数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间
即“变长数组”
此处的typename与一维数组一样,可以是任何基本类型,如int、double、char、结构体等
也可以是STL标准容器,例如vector、set、queue等
需要注意的是,如果typename也是一个STL容器
定义的时候要记得在>>符号之间加上空格
因为一些使用C++11之前标准的编译器会把它视为移位操作
vector<vector<int>> name; //加空格
联想到二维数组的定义,即其中一维是一个数组的数组
同理,vector数组,即Arrayname[]中的每一个元素都是一个vector
vector<typename> Arrayname[arraySize];
vector<int> vi[100];
这样Arrayname[0]~Arrayname[arraySize-1]中的每一个都是vecto容器
与vector<vector<int>> name不同的是,这种写法的一维长度已经固定为arraySize
另一维才是“变长”的
2、vector容器内元素的访问
(1)通过下标访问
与访问普通数组是一样的,如定义vector<typename> vi的vector容器来说
直接访问vi[index]即可
下标范围是0到vi.size()-1
(2)通过迭代器访问
迭代器iterator可以理解为一种类似指针的东西
定义是
vector<typename>::iterator it;
it就是一个vector<typename>::iterator型的变量
可以通过*it来访问vector里的元素
vector<int> vi;
for(int i=1;i<=5;i++)
{
vi.push_back(i);//push_back(i)在vi的末位依次添加1、2……
}
可以通过类似下标和指针访问数组的方式来访问容器内的元素
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> vi;
for(int i=1;i<=5;i++)
{
vi.push_back(i);//push_back(i)在vi的末位依次添加1、2
}
vector<int>::iterator it=vi.begin();
for(int i=0;i<5;i++)
{
printf("%d ",*(it+i));
}
return 0;
}
可以看出vi[i]和*(vi.begin()+i)是等价的
begin()函数的作用是取vi的首元素地址
end()并不是取vi的尾元素地址,而是取尾元素地址的下一个地址
左闭右开
end()作为迭代器末尾标志,不存储任何元素
同时,迭代器还实现了两种自加操作++it与it++
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> vi;
for(int i=1;i<=5;i++)
{
vi.push_back(i);//push_back(i)在vi的末位依次添加1、2
}
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++)
{
printf("%d ",*it);
}
return 0;
}
【注意】
在常用的STL容器中,只有vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的用法
3、vector常用函数
①push_back()
push_back(x)就是在vector后面添加一个元素x
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> vi;
for(int i=1;i<=3;i++)
{
vi.push_back(i);//push_back(i)在vi的末位依次添加1、2
}
for(int i=0;i<vi.size();i++)//size()函数会给出vi中元素的个数
{
printf("%d ",vi[i]);
}
return 0;
}
②pop_back()
用以删除vector的尾元素
③size()
用来获得vector中元素的个数
返回的是unsigned类型
用%d也不会出很大问题
④clear()
清空vector中的所有元素
⑤insert()
insert(it,x)用来向vector的任意迭代器it处插入一个元素x
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> vi;
for(int i=1;i<=3;i++)
{
vi.push_back(i);//push_back(i)在vi的末位依次添加1、2
}
vi.insert(vi.begin()+2,-1);
for(int i=0;i<vi.size();i++)//size()函数会给出vi中元素的个数
{
printf("%d ",vi[i]);
}
return 0;
}
⑥erase()
(1)删除单个元素
erase(it)即删除迭代器为it处的元素
vi.erase(vi.begin()+3);
vi[3]
(2)删除一个区间内的所有元素
vi.erase(vi.begin()+1,vi.begin()+4);
左闭右开
[vi[1],vi[4])
4、vector的常见用途
①储存元素
(1)vector本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好地节省空间
(2)有些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开
由于输出数据的个数是不确定的,为了更方便地处理最后一个满足条件的数据后面不输出额外的空格
可以先用vector记录所有需要输出的数据,最后一次性输出
②用邻接表存储图
知识点来自于《算法笔记》