1. 程式人生 > >C++變長陣列

C++變長陣列

什麼是變長陣列?   

變長陣列是指在編譯時不能確定陣列長度,程式在執行時需要動態分配記憶體空間的陣列。

1.普通方式實現一維變長陣列:

#include<iostream>  
 using   namespace   std;    
 int   main()  
 {  
   int   len;  
   cin>>len;  
   //用指標p指向new動態分配的長度為len*sizeof(int)的記憶體空間  
   int   *p=new   int[len];  
/*注意int   *p=new  int[len];這一句,你不能這樣做:  
 int   p[len];  
  C++編譯器會報錯說len的大小不能確定,因為用這種形式宣告陣列,陣列的大小需要在編譯時確定。而且這樣也不行:  
 int   p[]=new   int[len];  
  編譯器會說不能把int*型轉化為int[]型,因為用new開闢了一段記憶體空間後會返回這段記憶體的首地址,所以要把這個地址賦給一個指標,所以要用: 
int  *p=new   int[len]*/
........... delete[] p;//注意要登出指標p,使程式釋放用new開闢的記憶體空間
}

2.使用C++標準模版庫(STL)中的vector(向量)也可以實現變長陣列:

 #include<iostream>  
 #include<vector>  
 using  namespace   std;  
   
 int  main()  
 {  
   int  len;  
   cin>>len;  
   vector<int>   array(len);//宣告變長陣列  
   
   for(int  i=0;i<len;i++)  
   {  
     array[i]=i;  
    cout<<array[i]<<"\t";  
   }  
   return  0;  
 }  

使用完vector後呼叫~vector()解構函式釋放記憶體。

3.用vector實現變長二維陣列

#include <iostream>  
 #include  <vector>  
 #include  <iomanip>  
 using  namespace   std;  
 int  main()  
 {  
   int  i,  
           j, 
           m,  //行數  
           n;  //列數  
   
   cout  <<   "input  value  for   m,n:";  
   cin>>m>>n;  
      
   //注意下面這一行:vector<int後兩個">"之間要有空格!否則會被認為是過載">>"。  
   vector<vector<int>  >  vecInt(m,   vector<int>(n));      
   for  (i   =  0;  i   <  m;  i++)  
     for  (j   =  0;  j   <  n;  j++)  
       vecInt[i][j]   =  i*j;    
         
    for (i   =   0; i   <   m; i++)  
   {  
     for  (j   =  0;  j   <  n;  j++)  
      cout<<setw(5)<<vecInt[i][j]<<":"<<setw(9)<<&vecInt[i][j];  
     cout<<endl;  
   }     
   return  0;  
 }  

4.實現變長n維陣列

首先介紹一下雙指標方法,在這裡雙指標就是指像指標的指標,比如你可以這樣宣告一個數組:  

int  **p   =  new  int*[num1]; 而對每一個*p(一共num1個*p)申請一組記憶體空間:  
 for(int  i=0;   i<num1;  ++i) 
   p[i]  =   new  int[num2]; 
其中,num1是行數,num2是陣列的列數。
#include  <iostream>  
 #include  <iomanip>  
  using  namespace  std;  
   
 int  main()  
 {  
   int  num1,//行數  
           num2;//列數    
   cout<<"Please  enter  the   number  for  row   and  column:  "<<endl; 
   cin  >>   num1  >>  num2;  
   //為二維陣列開闢空間  
   int  **p   =   new  int*[num1];  
   for(int  i=0;   i<num1;  ++i) 
     p[i]  =   new  int[num2]; 
   
   for(int  j=0;j<num1;j++)  
   {  
     for(int  k=0;k<num2;k++)  
     { 
       p[j][k]=(j+1)*(k+1);  
       cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k];  
     } 
     cout<<endl;  
   }   
   //釋放二維陣列佔用的空間  
   for(int  m=0;m<num1;m++)  
     delete[]  p[m];  
   delete[]  p;  
   
   return  0;  
 }  

   由於陣列空間是動態分配的,陣列行之間的地址空間是不連續的,因為不同行的陣列元素的地址空間是用不同的new來分配的。而每一行之中列之間的地址空間是連續的。