刚学图论时,学的一个新知识。
对于图中的边可用邻接矩阵来表示,但当图中的点超过10000个的时候,再用这种方法就会爆内存了。所以这时候就需要用一个新知识来解决这个问题。
在点超过10000的时候,按照邻接矩阵的方法需要开一个10000*10000的数组,但数组中并不是有那么多条边,其中很多M[i][j]都是用不到的。所以就可以用vector数组来储存。
vector数组是一个动态数组,按照我的理解就是用多少就申请多少内存,这样就避免了不必要的内存申请。那么下面就可以说说vector数组的用法了,感觉和队列的用法比较类似。
首先头文件是<vector>,然后我们需要定义一个vector数组,定义方法是:vector<数据类型> 变量名;
有如下几种功能:
v.clear();
v.push_back();
v.size();
v.push_back();是用来往数组中依次添加元素,原理大概是,先申请一块内存,然后将数据存进内存。
v.clear();是用来清空数组中的元素。
v.size();可以返回数组中的元素的个数,数组从0开始。
当数据存进vector数组后,若要使用或者修改数组中第i个元素的数据,可直接引用v[i],就如同数组一样。
刚定义vector数组时,数组是空的,可以不需要v.clear(); 但是若是在多组数据输入,并且vector数组被定义为全局变量时,就需要清空数组中的数据。
举个例子,输入m,代表m组测试数据,每组测试数据先输入n,然后输入n个数,存进vector数组从小到大排序后输出。
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
vector<int > v;//可以试试把这个定义在while内并且去掉v.clear();
int main(){
int m;
cin>>m;
while(m--){
v.clear();//可以尝试若去掉后的结果
int n;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
v.push_back(x);
}
sort(v.begin(), v.end());
for(int i=0;i<v.size();i++)
cout<<v[i]<<' ';
cout<<endl;
}
return 0;
}