vector
vector
定义
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
一般作用:当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。
定义vector
头文件:#include< vector >
定义一维vector:vector<类型名>容器名,容器名,容器名…;
定义多维vector:
注意:在定义多维vector时,最后的> > >…一定要用空格隔开,不然电脑会认为是其它符号
定义二维vector: vector< vector < 类型名 > >容器名,容器名,容器名…;
定义三维vector: vector< vector < vector < 类型名 > > >容器名,容器名,容器名…;
以此类推…
vector成员函数
1、
push_back:在vector的最后添加一个数据:容器名.push_back(数据);
#include<vector>
using namespace std;
vector<int>a;//int类型
int main()
{
a.push_back(1);//添加1这个数字
return 0;
}
2、
pop_back:删除vector的最后一个数据 :容器名.push_back();
#include<vector>
using namespace std;
vector<int>a;//int类型
int main()
{
a.push_back(1);//添加1这个数字
a.pop_back();//删除vector的最后一个数据,也就是把数字1删了
return 0;
}
3、
at: 得到编号位置的数据(相当于[]):容器名. at(); 或者 容器名[下标]; 注意:vector的下标是从0开始计数的
#include<vector>
#include<iostream>//cin、cout头文件
using namespace std;
vector<int>a;//int类型
int main()
{
a.push_back(1);//添加1这个数字
cout<<a[0]<<" "<<a.at(0);//输出
a.pop_back();//删除vector的最后一个数据,也就是把数字1删了
return 0;
}
运行结果:
1 1
4、
begin:得到数组头的指针:容器名. begin();
end:得到数组的最后一个数据+1的指针:容器名. end();
运用:sort(容器名.begin(),容器名.end()); —>给vector中的数据排序(默认从小到大)
输入一个数n,表示有n个待排序的数,输入n个数,排序后从小到大输出它们的顺序
#include<vector>
#include<fstream>//scanf、printf头文件
#include<algorithm>//sort的头文件
using namespace std;
vector<int>a;//int类型
int n,num;
int main()
{
scanf("%d",&n);//表示有n个数字
for(int i=1;i<=n;i++)
{
scanf("%d",&num);//输入n个数字
a.push_back(num);//添加数字
}
sort(a.begin(),a.end());//排序
for(int i=0;i<n;i++)//vector的下标是从0开始计数的
{
printf("%d ",a[i]);//也可以是printf("%d ",a.at(i));
}
return 0;
}
输入数字:
20
1 -1 0 -500 25620 251 6 0 12 -4565 354 23 3202 4156 9 8 46 -546 23 20
输出结果:
-4565 -546 -500 -1 0 0 1 6 8 9 12 20 23 23 46 251 354 3202 4156 25620
5、
front:引用vector第一个数据:容器名. front();
back:引用vector最后一个数据:容器名. back();
#include<vector>
#include<fstream>//scanf、printf头文件
using namespace std;
vector<int>a;//int类型
int n,num;
int main()
{
scanf("%d",&n);//表示有n个数字
for(int i=1;i<=n;i++)
{
scanf("%d",&num);
a.push_back(num);//添加数字
}
printf("%d %d",a.front(),a.back());
return 0;
}
输入数据:
5
1 2 3 4 5
运行结果:
1 5
6、
size:当前使用数据的长度:容器名. size();
#include<vector>
#include<fstream>//scanf、printf头文件
using namespace std;
vector<int>a;//int类型
int n,num;
int main()
{
scanf("%d",&n);//表示有n个数字
for(int i=1;i<=n;i++)
{
scanf("%d",&num);
a.push_back(num);//添加数字
}
printf("%d",a.size());
return 0;
}
输入数据:
5
1 2 3 4 5
运行结果:
5
7、
empty:判断vector是否为空,不为空返回true,否则返回false:容器名. empty();
8、
swap:与另一个vector交换数据:swap(容器名,容器名);
#include<vector>
#include<iostream>
using namespace std;
vector<int>a,b;//int类型
int main()
{
a.push_back(1);
b.push_back(2);
cout<<a[0]<<" "<<b[0]<<endl;
swap(a,b);
cout<<a[0]<<" "<<b[0]<<endl;
return 0;
}
运行结果:
1 2
2 1
9、
clear:清空当前的vector:容器名. clear();
#include<vector>
#include<iostream>
using namespace std;
vector<int>a;//int类型
int main()
{
a.push_back(1);
cout<<a[0]<<endl;
a.clear();
a.push_back(100);
cout<<a[0]<<endl;
return 0;
}
运行结果:
1
100
10、
resize:改变当前使用数据的大小,如果它比当前使用的小,删除多出的部分,如果它比当前使用的大,就填充默认值(一般为0)
#include<iostream>
#include<vector>
using namespace std;
vector<int>a;
int main()
{
for(int i=10;i>=1;i--)a.push_back(i);
//输入10~1一共10个数字
for(int i=0;i<10;i++)//vector的下标是从0开始计数的
cout<<a.at(i)<<" ";
cout<<endl;
a.resize(12);//改变当前使用数据的大小,比当前使用的大,所以填充默认值0
for(int i=0;i<12;i++)
cout<<a.at(i)<<" ";
cout<<endl;
a.push_back(100);//输入100这个数字
for(int i=0;i<13;i++)//大小变为13
cout<<a.at(i)<<" ";
cout<<endl;
a.resize(5);//改变当前使用数据的大小,比当前使用的小,所以删除多出部分
for(int i=0;i<5;i++)
cout<<a.at(i)<<" ";
cout<<endl;
return 0;
}
运行结果:
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1 0 0
10 9 8 7 6 5 4 3 2 1 0 0 100
10 9 8 7 6
多维数组输出
与数组类似,格式如下:容器名[下标][下标]…
多维数组赋值
方法一:与数组嵌套
列:
#include<iostream>
#include<vector>
using namespace std;
vector<int>a[10];//与数组嵌套
int main()
{
a[10].push_back(10);
a[10].push_back(25);
cout<<a[10][1]<<endl;
return 0;
}
运行结果:
25
方法二
不像二维数组那样,可以直接对arr[i][j]进行循环赋值。在vector<vector>中,因为vector是一个容器,最外层的vector容器中放着更小的vector,而里层的vector里面放的是int型的数字。所以我们首先要对里层的vector容器赋值,然后再把里层的vector作为元素插入到外层的vector中。
例子:输入一个n行m列的二维数组,再输出
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int> >a;//这里注意要加空格隔开两个‘>’
vector<int>b;//一维vector
int n,m,num;
int main()
{
cin>>n>>m;//输入
for (int i=1;i<=n;i++){
b.clear();//每次记得清空数组
for(int j=1;j<=m;j++)
{
cin>>num;
b.push_back(num);
}
a.push_back(b);//把里层的vector作为元素插入到外层的vector中
}
//输出
cout<<endl;
for(int i=0;i<n;i++)//从0开始
{
for(int j=0;j<m;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
输入数据:
3 4
1 2 3 4
5 6 6 5
4 3 2 1
运行结果:
1 2 3 4
5 6 6 5
4 3 2 1