概念
vector像一个变长的数组.
常见用途:
(1)存储数据
(2)用临接表存储图
定义
vector<typename> name;
struct node{
int x,y;
};
vector<node> name;
vector<int> vi[100];
容器内元素的访问
通过下标访问
对于一个vector < typename > vi,直接访问vi[index]即可(如vi[0]、vi[1]),下标从0到vi.size()-1
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
int len=vi.size();
for(int i=0;i<len;i++)
cout<<vi[i]<<endl;
}
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
struct node{
int x,y;
};
vector<node> vi;
int main(){
for(int i=1;i<=10;i++){
node s;
s.x=i;s.y=i+1;
vi.push_back(s);
}
int len=vi.size();
for(int i=0;i<len;i++)
cout<<vi[i].x<<" "<<vi[i].y<<endl;
}
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<pair<int,int> > vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(make_pair(i,i+1));
}
int len=vi.size();
for(int i=0;i<len;i++)
cout<<vi[i].first<<" "<<vi[i].second<<endl;
}
通过迭代器访问
迭代器可以理解为类似指针的东西
vector<typename>::iterator it;
//vi.begin()为取vi的首元素地址;end()不是取尾元素的地址,而是取尾元素地址的下一个地址
vi[i]与*(vi.begin()+i)是等价的
STL中只有vector和string才能使用vi.bengin()+3这种迭代器加上整数的写法
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
int len=vi.size();
vector<int>::iterator it=vi.begin();
for(int i=0;i<len;i++)
cout<<*(it+i)<<endl;
}
自加(减)操作,++it
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
vector<int>::iterator it;
for(it=vi.begin();it!=vi.end();it++){
cout<<(*it)<<endl;
}
}
常用函数
push_back
在vector后面添加一个元素,时间复杂度O(1)
vi.push_back(i);
vi.push_back(make_pair(i,i+1));
node s;
s.x=i;s.y=i+1;
vi.push_back(s);
pop_back()
用以删除vector的尾元素,时间复杂度O(1)
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
vi.pop_back();
int len=vi.size();
vector<int>::iterator it=vi.begin();
for(int i=0;i<len;i++)
cout<<*(it+i)<<endl;
}
size()
用来获取vector中元素的个数,时间复杂度O(1)
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
vi.pop_back();
int len=vi.size();
cout<<len<<endl;
}
clear()
清空vector中所有元素,时间复杂度O(N),N为vector元素中的个数
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
vi.clear();
int len=vi.size();
cout<<len<<endl;
}
insert()
insert(it,x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度O(N)。
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
vi.insert(vi.begin()+3,100);
int len=vi.size();
for(int i=0;i<len;i++)
cout<<vi[i]<<endl;
}
erase()
删除有两种用法,删除单个元素,删除一个区间内的所有元素。时间复杂度为O(N)。
删除单个元素
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
vi.erase(vi.begin()+3);
int len=vi.size();
for(int i=0;i<len;i++)
cout<<vi[i]<<endl;
}
删除一个区间内所有的元素
erase(first,end)即删除[first,second)内所有的元素
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
vi.erase(vi.begin()+3,vi.begin()+7);
int len=vi.size();
for(int i=0;i<len;i++)
cout<<vi[i]<<endl;
}
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> vi;
int main(){
for(int i=1;i<=10;i++){
vi.push_back(i);
}
vi.erase(vi.begin(),vi.end());
int len=vi.size();
for(int i=0;i<len;i++)
cout<<vi[i]<<endl;
}
sort()
sort(vi.begin(),vi.end());由小到大排序
sort(vi.rbegin(),vi.rend());由大到小排序
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> vi;
int main(){
for(int i=10;i>=1;i--)
vi.push_back(i);
sort(vi.begin(),vi.end());
int len=vi.size();
for(int i=0;i<len;i++)
cout<<vi[i]<<" ";
cout<<endl;
sort(vi.rbegin(),vi.rend());
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
cout<<*it<<" ";
}
}