一.vector
1.一维数组的动态申请
c++中可直接构造一个动态数组,结构为:vector<T> vec,其实,T可以是int,float,double或其它自定义的数据类型。
向动态数组中插入元素:使用.push_back(),可在数组最后插入一个新的元素;
获取长度且访问元素:可通过.size()方法获得动态数组的长度,并通过下标访问数组;
修改元素:直接使用=赋值,例如vec[i]=x;
删除元素:与插入元素相类似,通过.pop_back()函数,删除动态数组最后的一个元素;
清空:使用.clear()函数,就可以清空vector数组;
构造函数:形如vector<T> vec(n,x),表示构造了一个长度为n,全是x的动态数组,如果不参入第二个参数,则其初始值均为0。
#include <bits/stdc++.h>
using namespace std;
struct student
{
string name;
int age;
};
int main()
{
//构造一维动态数组
vector<int> vec;
vec.push_back(3);
vec.push_back(5);
vec.push_back(7);
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<" ";//3 5 7
}
cout<<endl;
vec.pop_back();
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<" ";//3 5
}
vec.clear();
for(int i=0;i<vec.size();i++)
{
cout<<vec[i];//此时数组没空,没有输出
}
//用动态数组存储自定义数据
vector<student> class1;
student stu1,stu2;
stu1.name="wjf";
stu1.age=21;
stu2.name="fj";
stu2.age=21;
class1.push_back(stu1);
class1.push_back(stu2);
for(int i=0;i<class1.size();i++)
{
cout<<class1[i].name<<" "<<class1[i].age<<" ";//wjf 21 jf 21
}
//构造函数
int n=10;
vector <int> vec(n,x);//相当于输入n个x,如果不传入第二个参数,则初始值都是0;
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<" ";
}
return 0;
}
2.二维数组的动态申请
二位动态数组结构:vector<vector<int> > vec,需注意在<int> >中间有一个空格,否则在一些老版编译器上将运行不通过
#include <bits/stdc++.h>
using namespace std;
int main()
{
int row,col;
cin>>row>>col;
//申请动态空间
vector<vector<int> >vec(row,vector<int> (col));
//使用空间
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
vec[i][j]=rand();
cout<<vec[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
除vector外,在c++中二维数组的动态申请还可通过new实现
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int **a=new int*[n];
for(int i=0;i<n;i++)
a[i]=new int[m];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
a[i][j]=rand()%100;
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
ps:通过动态申请产生的二维数组a[n][m],其任意的a[n]都是一个int*类型,即一个地址了,所以只能a[i][j]或者*(*(a+i)+j)来访问数组的元素而不能通过a[i*n+j]访问;而通过静态声明产生的数组,因其内存空间是连续的,故通过a[i*n+j]访问。