C與C++建立2維陣列

靜態陣列


大家應該都知道如何建立,我想要整數的256*256大小的陣列就

int Array[256][256];

雖然一般圖片較小的時候,靜態陣列就可以完成很多事情,而且Compile 程式也不會有問題,

但是實際上程式在跑的時候,OS會對這種靜態陣列作限制,

只要超過一定的大小,程式在跑到要配置一個大的靜態陣列,Process會直接被OS踢掉! 產生所謂的Runtime ERROR 


動態陣列


要建立一個動態大小的2維陣列一般會用"指標陣列"來達成

下面會描述三種動態2維陣列的建立方法,其實概念是一樣的,只是執行效率不一樣。

我個人現在要寫都是使用第二種方法。

另外還有兩種建立2維陣列的泛用型範例,給C的是用macro寫的,給C++的是用template寫的

第一種建立方法

先建立一個動態指標陣列(數量為圖片高度),

然後再為指標陣列中的每一個元素配置一個動態陣列(數量為圖片寬度),

當我要取用動態陣列裡面的元素時,就可以用Array[h][w]來存取

而要刪除動態陣列時,則是需要先把指標陣列中的每一個元素所擁有的動態陣列先刪除掉,

然後才能刪除指標陣列本身,否則會造成Memory Leak



程式碼為

    // build array     
    double** Array = new double*[Height];
        
    for (int h=0 ; h<Height ; ++h)
    {
      Array [h] = new double[Width];
      
      // 初始化 
      for (int w=0 ; w<Width ; ++w)
        Array[h][w] = 0.0;
    }
    
    
    // delete array     
    for (int h=0 ; h<Height ; ++h)
    {
      delete[] Array[h];
    }    
    delete[] Array;
    Array = NULL; // 確保正確性 
    


第二種建立方法


第一步和上一個方法一樣是先建立一個動態指標陣列(數量為圖片高度),

然後配置一個大的動態陣列(數量為圖片寬度*圖片高度),再將指標陣列一一指到這個大的動太陣列的不同位置上。

取用陣列元素的方法與第一種方法相同Array[h][w]

而要刪除動態陣列時,也是要先刪除後配置的陣列,然後才是指標陣列,

我個人比較推薦這種策略,因為能夠相容2維跟1維,如果我有想要用一維陣列的存取方式,

只要宣告一個指標指到Array[0]就可以了。 

double* Single = Array[0];
for (int i=0 ; i<Height*Width ; ++i)
  Single[i] = 0.0;

而且這個方法不需要知道圖片高寬也能夠刪除動態陣列! 超棒!



程式碼為

    // build array     
    double** Array = new double*[Height];
    Array[0] = new double[Height*Width];
    
    for (int h=0 ; h<Height ; ++h)
    {
      if (h>0) Array[h] = Array[h-1] + Width;
      
      // 初始化 
      for (int w=0 ; w<Width ; ++w)
        Array[h][w] = 0.0;
    }
    
    
    // delete array     
    delete[] Array[0];
    delete[] Array;
    Array = NULL; // 確保正確性 

第三種建立方法

使用C++的STL函數庫功能

建立的策略跟第一種方法一樣,只是都用vector提供的功能來建立。

由於剛從大學畢業的同學多數都不懂STL,所以這種寫法大家看看有這種策略就好了。


    // build array     
    vector< vector<double> > Array(Height);
    for (int h=0 ; h<Height ; ++h)
    {
      Array[h].resize(Width);
      
      // 初始化 
      for (int w=0 ; w<Width ; ++w)
        Array[h][w] = 0.0;
    }
    

    // delete array
    for (int h=0 ; h<Height ; ++h)
    {
      Array[h].clear();
    }
    Array.clear();

留言