維度及長度均可任意變形的動態陣列

2021-05-11 08:29:46 字數 1332 閱讀 1892

一、維度及長度均可任意變形的動態陣列概述 收藏

近日,有同事需要設計乙個可自由變形的多維陣列,苦思數日,不得其解,求助於我。於是我幫他寫了乙個可自由改變維度及長度的陣列adt。後來想,網上應該也有人需要這種東西吧,何不放到部落格上來,讓有此需要的朋友也一同來參考參考。於是就將開始的3個函式擴充套件為20個函式。鑑於時間倉促,原始碼一定有很多不完善的地方,如果遇到哪些牛人有興趣對其進行改進,更求之不得了。

我將此adt稱為dynamic dimensionality and length array,動態維度及長度陣列,簡稱ddla。它的主要特性如下:

1. 超越c99的vla可變長陣列。vla雖然每維的長度可為變數,但仍有兩個限制,一是維度不可變;二是一旦定義,長度不能再改變,即非動態的。ddla則無論維度、長度皆動態,不但每維長度可為變數,維度也可為變數。

2. ddla即使定義之後,仍可以根據需要在任何時候任意改變維度及長度,做到真正的完全動態,堪稱陣列中的變形金剛。而且,變形之後,原有資料仍可保留。變形方式簡單快捷。

3. 超越c/c++陣列作為形參會隱式轉換為指標的特性。c/c++這項特性在提高效率的同時,也造成了在被調函式內部無法通過sizeof運算直接取得傳入陣列大小的問題。ddla繼續保持這個效率的同時,仍然可以在被調函式內部直接計算出傳入陣列的大小。

view plaincopy to clipboardprint?

int i, m = 10, n = 20;  

int **p = ( int** )malloc( m * sizeof( int* ) );  

for( i = 0; i < m; ++i )  

p[i] = ( int* )malloc( n * sizeof( int ) ); 

int i, m = 10, n = 20;

int **p = ( int** )malloc( m * sizeof( int* ) );

for( i = 0; i < m; ++i )

p[i] = ( int* )malloc( n * sizeof( int ) );

1. 堆管理函式頻繁執行,效率低下,陣列越大,效率影響越明顯;

2. 如果中間某個步驟記憶體分配失敗,需要對已分配的記憶體重新釋放,演算法複雜;

3. 陣列使用完後,需要逐個記憶體塊釋放,效率低;

4. 若需要動態改變陣列,演算法複雜。

但實際上,中間位址緩衝區和元素儲存區的大小是可以預先計算出來的,在此前提下,兩個儲存塊可以預先整體一次分配,效率有很大提高,更重要的是,這個做法使陣列變形的演算法大大簡化,變形過程變得非常簡單,只要改變元素儲存區的大小,然後重新產生中間位址就行了。ddla就是基於這個原理設計的,使用的中間位址緩衝區和元素儲存區都是連續的。

C 陣列維度 行數 列數 長度區別

array.rank 得到的是陣列的維數,你這裡的 arr 是個二維陣列,所以結果是 2。int arr new int 9,9 這也是二維陣列,結果也是 2。int arr new int 4,2,8 這也是三維陣列,結果是 3。array.getupperbound 得到的是指定維度最後乙個元素...

Delphi陣列及長度

一,定義 1.標準方法 varmyarr array 0.10 of integer 定義靜態一維陣列 2.根據預定義型別來宣告陣列 type tmyarr array 0.10 of integer 先定義乙個陣列型別 varmyarr tmyarr 再定義靜態陣列 3.在非過程區可以直接賦值 m...

Delphi陣列及長度

一,定義 1.標準方法 varmyarr array 0.10 of integer 定義靜態一維陣列 2.根據預定義型別來宣告陣列 type tmyarr array 0.10 of integer 先定義乙個陣列型別 varmyarr tmyarr 再定義靜態陣列 3.在非過程區可以直接賦值 m...