精華區beta C_and_CPP 關於我們 聯絡資訊
個人所知道的幾種常用方法: 一、當第二維度 n 是編譯期常量時: T (*p)[n] = new T[m][n]; ... delete [] p; 優點:使用方便、語法也不複雜。 缺點:n 不能是執行期變量。 二、兩個維度 m, n 都是變量,基本方法: T **p = new T*[m]; for (int i=0; i<m; ++i) { p[i] = new T[n]; } ... for (int i=0; i<m; ++i) { delete [] p[i]; } delete [] p; 優點:使用方便。 缺點:非連續儲存,語法繁瑣。 三、用一維陣列模擬 T *p = new T[m*n]; ... delete [] p; 優點:連續儲存。 缺點:使用極不方便。 四、另一種一維陣列模擬法(綜合二與三) T **p = new T*[m]; p[0] = new T[m*n]; for (int i=1; i<m; ++i) { p[i] = p[i-1] + n; } ... delete [] p[0]; delete [] p; 優點:連續儲存,使用方便。 缺點:語法繁瑣。 五、使用 std::vector using std::vector; vector<vector<T> > p(m, vector<T>(n)); 優點:使用方便,語法簡潔,自動管理記憶體,帶有 value 語意,彈    性、擴充性佳(例如可動態增長,選擇性邊界檢查、可自然搭    配標準演算法)。 缺點:非連續儲存,編譯速度下降,程式碼膨脹、執行速度略降,當    m, n 很小的時候,大量使用可能造成記憶體浪費(視實作版本    而定)。 六、使用 boost::multi_array typedef boost::multi_array<T, 2> Array; // 2D Array Array array(boost::extents[m][n]); 優點:專為 array 的特性而設計,簡潔高效、可延伸至 n 維,使用    方便,自動管理記憶體,帶有 value 語意,擴充性佳(例如它    支援 sub-view, shape 等觀念和用法) 缺點:某些舊的編譯器應該是編不過。另外用戶必須稍微學習並熟悉    一下它的用法以及 boost 的設計觀念。 ◎短評: 就一般的應用場合,個人是最推薦第五種(vector),只有在有極嚴格 的效能需求(低階的核心程式碼,或大量使用小規模的 array)時,才 使用手動配置。另外如果編譯器支援的話,也是建議大家可以學習使用 boost::multi_array(如果是工作需要而限定了編譯器就算了,程式能 跑要緊)。     -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.214.120
adxis:推好文220.143.212.239 09/07
tititata:收錄一下吧~~ ^^140.115.152.151 09/07
embedded:感謝大大分享...........讚140.123.106.102 09/07