動態創建多維數組——纔不簡單

我們知道在C或C++裏,有時候我們要定義的數組的長度是不定的,所以要動態地創建數組,也就是在運行的時候動態分配內存。
我們常用的是對一維或二維數組動態的創建,但畢竟有時候我們要對更多維的數組進行動態地創建的(儘管少用)。
對於一維數組p[n]的動態創建:
    char *p=new char[n];
對於二維數組p[n][m]的動態創建:
    char **p=new char*[n];
    for(int i=0;i<n;i++)
        p[i]=new char[m];
其實一維二維的創建都比較簡單,但如果是4維或5維呢?這往往使初學者不知所云。其實只要我們從中找出規律後,就一通百通了。
往往,我們對同一件事物,以不同的看法看它,就有不同的收穫或不同的見解。而對於抽象的事物,我們要建立自己的模型,模型建立得好壞,對問題是否能夠得到解決有很大的影響。
結構體我們都懂,其實我們也可以把數組“看成"是結構體,比如數組a[8],可以看成是一個有八個相同類型成員的結構體;如數組a[n][m]可以看成是一個有n個類型爲一維數組的成員的結構體,而每個成員可以看成是

一個有m個相同類型成員的結構體,…………。這樣,對於一個N維的數組,可以把它看成一個有N層的樹,我們實際的數據存在樹的葉結點裏,而樹的每一層是我們動態創建的,比如數組a[i1][i2][i3]……[N-2][N-1][N],第

一層個數爲i1,第二層個數爲i1*i2,第N層個數爲i1*i2*……*N。所以,維數越多,時間和空間上都增長得非常快,而且我們一般也很少用到多維的動態數組,但是,儘管這樣,這種模型是有利於我們對多維數組以及它的動態創建的理解的,。下面就說說如何以這樣的模型或思維方式動態創建四維的數組p[n][m][p][t]:

     char****p=new char***[n];//首先創建一個根結點,類型爲char****,它指向一個有n個元素且類型爲char***的數組(或每個成員都爲char***類型的結構體)
     for(int i=0;i<n;i++)//創建第二層樹結點,每個結點的類型爲char***,它指向一個有m個元素且類型爲char**的數組(或每個成員都爲char**類型的結構體)
    {
          p[i]=new char**[m];
         for(int j=0;j<m;j++)//創建第三層樹結點,每個結點的類型爲char**,它指向一個有q個元素且類型爲char*的數組(或每個成員都爲char*類型的結構體)
         {
        p[i][j]=new char*[q];
for(int k=0;k<q;k++)//創建第四層樹結點,每個結點的類型爲char*,它指向一個有t個元素且類型爲char的數組(或每個成員都爲char類型的結構體)
{
       p[i][j][k]=new char[t];
                }
         }
    }
到此,這個四維的數組就創建完成了,我們可以給n,m,p,t賦一定的值,就創建一個大小爲n*m*p*t的數組了,然後我們就可以如這樣:*p[i][j][k]=value;存入我們的值了

回收內存時也簡單,和分配的時候剛好相反,如下:

int t1=n,t2=m,t3=q;
for(i=0;i<n&&t1;i++)
{
   for(int j=0;j<m&&t2;j++)
   {
    for(int k=0;k<q&&t3;k++)
     delete p[i][j][k],t2--;
    delete p[i][j],t3--;
   }
   delete p[i],t1--;
}
delete [] p;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章