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

C++ 動態二維陣列建立完全指南:三種主流方案優劣對比

     編輯:關於C++

C++ 沒有內建動態多維陣列,但在堆上建立二維陣列是常見需求。本文對比 指標陣列法、單一連續塊法、std::vector 法 三大主流方案,從記憶體佈局、快取友好度、釋放便利性、現代 C++ 風格四個維度深度剖析,並給出可直接複製的範本代碼。

方案一:指標陣列(傳統教科書寫法)

int **arr = new int*[rows];
for (int i = 0; i < rows; ++i)
    arr[i] = new int[cols];

// 釋放
for (int i = 0; i < rows; ++i) delete[] arr[i];
delete[] arr;
  • ✅ 直觀、行長度可不一(鋸齒陣列)
  • ❌ 記憶體不連續,快取未命中率高;多次 new/delete 碎片化、慢;釋放易漏、繁瑣

方案二:單一連續塊(高效能首選)

// 配置
int *flat = new int[rows * cols];
// 存取:arr[row][col] → flat[row * cols + col]
auto idx = [cols](int r, int c) { return r * cols + c; };
flat[idx(2, 3)] = 42;

// 釋放
delete[] flat;
  • ✅ 記憶體完全連續,預取器友好,遍歷極快
  • ✅ 單次配置/釋放,無碎片,unique_ptr 完美托管
  • ❌ 需手動計算索引(可封裝類別隱藏)

方案三:std::vector(現代 C++ 標準做法)

// 扁平化 vector
std::vector flat(rows * cols);
flat[r * cols + c] = val;

// 或巢狀 vector(不連續,但自動管理)
std::vector> mat(rows, std::vector(cols));
mat[r][c] = val;
  • ✅ RAII 自動釋放,例外安全
  • ✅ 支援 .data() 取得原始指標對接 C API
  • ✅ 扁平化版本兼具連續記憶體與自動管理

封裝成類別:安全、易用、零開銷

template <typename T>
class Matrix {
    size_t rows_, cols_;
    std::unique_ptr data_; // 或 vector
public:
    Matrix(size_t r, size_t c) : rows_(r), cols_(c), data_(std::make_unique(r*c)) {}
    T& operator()(size_t r, size_t c) { return data_[r * cols_ + c]; }
    const T& operator()(size_t r, size_t c) const { return data_[r * cols_ + c]; }
    size_t rows() const { return rows_; }
    size_t cols() const { return cols_; }
    T* data() { return data_.get(); }
    const T* data() const { return data_.get(); }
};

選型決策樹

  1. 需要鋸齒陣列(每行長度不同) → 方案一或巢狀 vector。
  2. 高效能數值計算、圖像處理、矩陣運算 → 方案二/三扁平化。
  3. 一般業務邏輯、快速原型、需 STL 算法支援 → 方案三。
  4. 對接舊式 C API 要求 int** → 方案一或臨時建立指標陣列指向扁平塊。

現代 C++ 最佳實踐

預設選擇扁平化 std::vector 或 std::unique_ptr<T[]> 封裝類別。 只有極少數舊代碼互操作場景才手寫 new[]/delete[]。

掌握這三種方案的底層機制,能讓你在效能調優、記憶體診斷、跨語言介面對接時,精準選擇最適合的資料結構佈局。

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