转至:http://www.cnblogs.com/lxshanye/archive/2013/05/20/3088558.htmlC++动态数组1.变长一维数组 1: //文件名: array01.cpp 2: #include<iostream> 3: using namespace std; 4: int main() 5: { 6: int len; 7: cin>>len; 8: //用指针p指向new动态分配的长度为len*sizeof(int)的内存空间 9: int *p=new int[len]; 10: ........... 11: delete[] p; 12: return 0; 13: } 注意int *p=new int[len];这一句,你不能这样做: 1: //文件名: array02.cpp 2: #include<iostream> 3: #include<vector> 4: using namespace std; 5: int main() 6: { 7: int len; 8: cin>>len; 9: vector<int> array(len);//声明变长数组 10: for(int i=0;i<len;i++) 11: { 12: array[i]=i; 13: cout<<array[i]<<"/t"; 14: } 15: return 0; 16: } 这里的变长数组让我联想到了java的java.util包中的vector和C#中的ArrayList,它们也可以在各自的语言中实现变长数组。不过C++中的vector不能像C#一样有托管的垃圾回收机制回收被占用的内存空间,但是你可以在使用完vector后调用~vector()析构函数释放内存。 1: //文件名: array03.c 2: #include <stdio.h> 3: #include <malloc.h> 4: void main() 5: { 6: int x,y,i,j; 7: float **a,*b; 8: printf("请输入你所求解的线性方程组的行数x:x="); 9: scanf("%d",&x); 10: printf("请输入你所求解的线性方程组的列数y:y="); 11: scanf("%d",&y); 12: a=(float **)malloc(sizeof(float *) *x); 13: b=(float *)malloc(sizeof(float) *x); 14: for(i=0;i<x;i++) 15: { 16: *(a+i)=(float *)malloc(sizeof(float) *y); 17: } 18: /*读入数据*/ 19: printf("请按行的顺序依次输入系数的值(共%d项):",x*y); 20: for(i=0;i<=x-1;i++) 21: for(j=0;j<=y-1;j++) 22: scanf("%f",&a[i][j]); 23: printf("请按列的顺序依次输入常数的值(共%d项):",x); 24: for(j=0;j<=x-1;j++) 25: scanf("%f",&b[j]); 26: printf("您输入方程组的增广矩阵为:/n"); 27: for(i=0;i<=x-1;i++) 28: { 29: for(j=0;j<=y-1;j++) 30: printf("%.5f ",a[i][j]); 31: printf("%.5f ",b[i]); 32: printf("/n"); 33: } 34: free(b); 35: for(i=0;i<x;i++) 36: free (*(a+i)); 37: } 那么用C++怎样实现呢?在C++中可以通过new和delete运算符动态开辟和释放空间,其中new与C中malloc函数的功能相似,delete与C中free函数的功能相似。用C++实现变长二维数组时可以采用两种方法:双指针方法和使用STL中vector(向量)的方法。 1: //文件名: array04.cpp 2: #include <iostream> 3: #include <iomanip> 4: using namespace std; 5: int main() 6: { 7: int num1,//行数 8: num2;//列数 9: cout<<"Please enter the number for row and column: "<<endl; 10: cin >> num1 >> num2; 11: //为二维数组开辟空间 12: int **p = new int*[num1]; 13: for(int i=0; i<num1; ++i) 14: p[i] = new int[num2]; 15: for(int j=0;j<num1;j++) 16: { 17: for(int k=0;k<num2;k++) 18: { 19: p[j][k]=(j+1)*(k+1); 20: cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k]; 21: } 22: cout<<endl; 23: } 24: //释放二维数组占用的空间 25: for(int m=0;m<num1;m++) 26: delete[] p[m]; 27: delete[] p; 28: return 0; 29: } 以下是运行结果: 1: //文件名: array05.cpp 2: #include <iostream> 3: #include <vector> 4: #include <iomanip> 5: using namespace std; 6: int main() 7: { 8: int i, 9: j, 10: m, //行数 11: n; //列数 12: cout << "input value for m,n:"; 13: cin>>m>>n; 14: //注意下面这一行:vector<int后两个">"之间要有空格!否则会被认为是重载">>"。 15: vector<vector<int> > vecInt(m, vector<int>(n)); 16: for (i = 0; i < m; i++) 17: for (j = 0; j < n; j++) 18: vecInt[i][j] = i*j; 19: for (i = 0; i < m; i++) 20: { 21: for (j = 0; j < n; j++) 22: cout<<setw(5)<<vecInt[i][j]<<":"<<setw(9)<<&vecInt[i][j]; 23: cout<<endl; 24: } 25: return 0; 26: } 以下是运行结果: 1: //文件名: array06.cpp 2: #include <iostream> 3: #include <vector> 4: #include <iomanip> 5: using namespace std; 6: int main() 7: { 8: int i, 9: j, 10: k, 11: m, //一维坐标 12: n, //二维坐标 13: l; //三维坐标 14: cout << "input value for m,n,l:"; 15: cin>>m>>n>>l; 16: vector<vector<vector<int> > > vecInt(m, vector<vector<int> >(n, vector<int>(l))); 17: for (i = 0; i < m; i++) 18: for (j = 0; j < n; j++) 19: for(k = 0; k < l; k++) 20: vecInt[i][j][k] = i+j+k; 21: for (i = 0; i < m; i++) 22: { 23: for (j = 0; j < n; j++) 24: { 25: for(k = 0; k<l; k++) 26: cout<<setw(5)<<vecInt[i][j][k]<<":"<<setw(9)<<&vecInt[i][j][k]; 27: cout<<endl; 28: } 29: cout<<endl; 30: } 31: return 0; 32: } 运行结果: |
|