vector
使用vector之前,需要定义头文件< vector >,< bits/stdc++.h >万能头中也包含
vector是什么?
简单来说,vector是c++系统库里自带的一种数组,但与一般数组不一样的是,vector的存储方式是动态的,有多少个数要读进来,vector的空间就会扩大
简单模拟一下:
读入1
空间++,总空间扩大
数: 1
下标:0
读入2
空间++,总空间扩大
数: 1 | 2
下标:0 | 1
读入3
空间++,总空间扩大
数: 1 | 2 | 3
下标:0 | 1 | 2
所以我们用vector做题时,不用根据数据范围来开
定义方式:
#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
return 0;
}
由此可以看出vector的定义结构:
vector <数据类型> 名称;
接下来介绍vector的各种函数
最基本的读入:
vector的读入并不像普通数组一样scanf(“%d”,&a[i])就行的
而是要用push_back来进行读入
a.push_back(1)
数: 1
下标:0
a.push_back(2)
数: 1 | 2
下标:0 | 1
a.push_back(3)
数: 1 | 2 | 3
下标:0 | 1 | 2
代码实现:
#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
for(int i=1;i<=5;i++)
{
int x;
scanf("%d",&x);
a.push_back(x);
}
for(int i=0;i<a.size();i++)
{
printf("%d\n",a[i]);
}
return 0;
}
输出为:
1
2
3
4
5
由上面的程序珂以看到,vector是可以用size()来查询数组的大小的,就像string一样
所以我们要遍历一遍vector时,size()是很好的选择
#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
for(int i=1;i<=5;i++)
{
int x;
scanf("%d",&x);
a.push_back(x);
}
printf("%d\n",a.size());
return 0;
}
输出:
5
接下来就是a.begin()与a.end()
让我们先模拟出一串数
1 | 2 | 3 | 4 | 5
a.begin()就是第一个数的下标0
a.end()就是a.size(),最后一个数的下标+1
不可直接输出a.begin()和a.end()!
除了size(),还可以用迭代器来遍历vector
迭代器的定义:
vector <int> :: iterator it;
it为名称
#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
for(int i=1;i<=5;i++)
{
int x;
scanf("%d",&x);
a.push_back(x);
}
for(int i=0;i<a.size();i++)
{
printf("%d\n",a[i]);
}
printf("*******\n");
vector <int> :: iterator it;
for(it=a.begin();it!=a.end();it++)
{
printf("%d\n",*it);
}
return 0;
}
输入:
1 2 3 4 5
输出:
1
2
3
4
5
1
2
3
4
5
珂以看到,迭代器与size()没什么两样
注意,迭代器输出不是a[i],是*it
输入输出讲完了,接下来是删除和插入
a.erase( ) 删除
a.insert( , ) 插入
erase
我们来删除下标为4的一格
#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
for(int i=1;i<=5;i++)
{
int x;
scanf("%d",&x);
a.push_back(x);
}
a.erase(a.begin()+3);
//a.insert(a.begin()+3,4);
for(int i=0;i<a.size();i++)
{
printf("%d\n",a[i]);
}
return 0;
}
输入:
1 2 3 4 5
输出:
1
2
3
5
珂以看到,a.erase(a.begin()+3)成功删除下标为3的一格,而后面的自动缩进,这就是vector的神奇之处
除了这个,erase还可以删除一个区间
#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
for(int i=1;i<=5;i++)
{
int x;
scanf("%d",&x);
a.push_back(x);
}
a.erase(a.begin()+1,a.begin()+3);
//a.insert(a.begin()+3,4);
for(int i=0;i<a.size();i++)
{
printf("%d\n",a[i]);
}
return 0;
}
输入:
1 2 3 4 5
输出:
1
4
5
成功删除了一个区间
注意,是左闭右开[ )
insert
#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
for(int i=1;i<=5;i++)
{
int x;
scanf("%d",&x);
a.push_back(x);
}
//a.erase(a.begin()+1,a.begin()+3);
a.insert(a.begin()+3,4);
for(int i=0;i<a.size();i++)
{
printf("%d\n",a[i]);
}
return 0;
}
输入:
1 2 3 4 5
输出:
1
2
3
4
4
5
介系insert,我就不多讲了
好了,今天的vector就说到这,其他有需要我会继续更新的,dalao或julao多多指点
(未经允许禁止转载)