首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 實現真正的二維動態數組模板

     編輯:關於C語言

前言:為什麼需要動態數組?

在 C++ 開發中,靜態數組雖然效率高,但大小在編譯期固定,無法適應運行時數據量變化的場景。例如建立工廠工人資料庫時,各車間人數不一,若用靜態數組必須預估上限,不僅浪費記憶體,還會因上限不足導致維護成本高昂(需重新編譯、分發更新)。動態數組基於堆內存分配,大小可在運行期按需調整,完美解決這些問題。

一維動態數組的核心實現

我們設計模板類 Dynamic1Dim<T>,通過重載 operator[] 實現「越界自動擴容」:

template <typename T>
class Dynamic1Dim {
public:
    Dynamic1Dim(); ~Dynamic1Dim();
    T& operator[](int index);
protected:
    bool EnlargeDim(int newSize);
    T* m_pBuf;
    int m_iSize;
};

關鍵技術點

  • 構造函數:初始分配 1 個元素空間,使用 malloc + placement new 構造對象。
  • operator[]:檢查索引合法性,超出當前大小則調用 EnlargeDim 擴容。
  • EnlargeDim:用 realloc 擴展內存,對新增區域逐個調用 placement new 初始化。
  • 析構函數:必須顯式調用每個元素的析構函數(m_pBuf[i].~T()),再 free 釋放內存,防止成員內存洩漏。

二維動態數組的組合設計

二維動態數組本質是「動態一維數組的動態數組」。模板類 Dynamic2Dim<T> 內部持有 Dynamic1Dim<T>* 指針陣列:

template <typename T>
class Dynamic2Dim {
public:
    Dynamic2Dim(); ~Dynamic2Dim();
    Dynamic1Dim<T>& operator[](int row);
protected:
    bool EnlargeY(int newRowCount);
    int m_iYSize;
    Dynamic1Dim<T>* m_pYBuf;
};

運作機制

  1. 構造時創建 1×1 的初始結構。
  2. operator[](row) 檢查行索引,不足則調用 EnlargeY 擴展行指針陣列,新行自動為長度 1 的一維動態數組。
  3. 返回的 Dynamic1Dim<T>& 再觸發其 operator[](col) 完成列擴展,實現 m_dim[4][10] = 710 這樣的鏈式操作。
  4. 析構時逐行調用一維數組析構,最後釋放行指針陣列內存。

總結

這種設計完全模擬靜態數組的 arr[i][j] 語法,卻擁有完全動態的大小調整能力,且正確處理了構造/析構語義,是 C++ 模板元編程與手動內存管理結合的經典範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved