vector:向量
变长数组 (其实为了实现变长,代价是很大的) vector本质上就是数据结构里基于数组的线性表
节省内存
以邻接表的方式存储图
1.vector的定义
vector<typename> name;
eg:
vector<int> name;
vector<node> name; //node是结构体类型
vector<vector<int> > name; //注意>>直接要用空格 > > 否则有些编译器会误认为是移位
vector<int> vi[100];
最后两个都是vectors数组 但是最后一个二维数组只有其中一维是变长的
2.vector容器内元素的访问
(1)通过下标访问
vector<int> vi;
访问:vi[index] vi[0] vi[1]
index范围:0~vi.size()-1
(2)通过迭代器访问
迭代器是一个类似指针的东西
vector<int>::iterator it;
代码1:
#include<iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);//尾部分别插入1 2 3 4 5
}
//下标输出
cout<<"下标输出:";
for(int i=0;i<5;i++){
cout<<vi[i]<<" ";
}
//iterator迭代器输出
vector<int>::iterator it=vi.begin();//初始化为begin
cout<<"\n迭代器输出:";
for(int i=0;i<5;i++){
cout<<*(it+i)<<" ";
}
cout<<endl;
return 0;
}
- vi[i]和*(vi.begin()+i)是等价的
- vi.begin()首地址,vi.begin()最后一个元素的下一个地址 (美国人习惯左闭右开)
- 迭代器支持自加和自减操作,it++,++it,it--,--it
代码2:
#include<iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);//尾部分别插入1 2 3 4 5
}
//iterator迭代器输出
//vector的迭代器不支持it<vi.end()的写法,因此循环条件只能用it!=vi.end()
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
注意:常用STL中,只有vector和string中才允许使用vi.begin()+3这种迭代器加上整数的写法
3.vector常用函数实例解析
(1)push_back()
push_back(x)在vector后面添加一个元素x,时间复杂度O(1)
#include<iostream>
#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++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}
(2)pop_back()
pop_back() 删除vector尾元素,时间复杂度O(1)
#include<iostream>
#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++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}
(3)size()
获得vector中元素个数,时间复杂度O(1) 类型unsigned %d输出也没问题
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
cout<<vi.size()<<endl;
vi.pop_back();
cout<<vi.size()<<endl;
return 0;
}
(4)clear()
clear()用来清空vector中的所有元素,时间复杂度O(N),N为vector中元素的个数
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
cout<<vi.size()<<endl;
vi.clear();
cout<<vi.size()<<endl;
return 0;
}
(5)insert()
insert(it,x),在vector任意迭代器it处插入一个元素x,后面的元素全部自动向后移一位,可以理解为在it左边插入一个元素,时间复杂度为O(N) //vector就是数组结构里基于数组的线性表
#include<iostream>
#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);
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}
(6)erase()
删除单个元素或者删除一个区间内所有的元素
①删除单个元素 erase(it)
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=5;i<=9;i++){
vi.push_back(i);//5 6 7 8 9
}
vi.erase(vi.begin()+3);//删除8
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}
②删除一个区间内所有元素
erase(first,last) 删除[first,last)内的所有元素 //美国人还是喜欢左闭右开
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=5;i<=9;i++){
vi.push_back(i);//5 6 7 8 9
}
vi.erase(vi.begin()+1,vi.begin()+4);//删除 6 7 8
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
cout<<endl;
return 0;
}
4.vector常见用途
(1)储存数据
①节省空间
②避免一行末尾输出多余空格(暂时不知道如何处理)
(2)用邻接表存储图
vector存储图,避免了复杂的指针操作
............后续不断更新添加。。。。。。