如何在 C++ 中使用 new 宣告 2D 陣列
 
本文介紹了用 new 動態宣告二維陣列的多種 C++ 方法。
用 arr[x][y] 記法宣告二維陣列來訪問元素
    
此方法利用 new 關鍵字,使生成的矩陣結構可以使用陣列符號–[x][y] 進行訪問。首先,我們宣告指向整數(int **)變數的指標,並在陣列中分配行大小的 int 指標陣列。接下來,我們遍歷該指標陣列,並在每次迭代中分配列大小的 int 陣列。最後,當我們完成二維陣列操作後,我們需要釋放分配的記憶體。注意,釋放是在逆序迴圈中完成的。
#include <iomanip>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::setw;
constexpr int ROW = 4;
constexpr int COL = 6;
int main() {
  int **matrix = new int *[ROW];
  for (int i = 0; i < ROW; ++i) {
    matrix[i] = new int[COL];
  }
  for (int i = 0; i < ROW; ++i) {
    for (int j = 0; j < COL; ++j) {
      matrix[i][j] = rand() % 100;
      cout << setw(2) << matrix[i][j] << "; ";
    }
    cout << endl;
  }
  for (int i = 0; i < ROW; ++i) {
    delete matrix[i];
  }
  delete[] matrix;
  return EXIT_SUCCESS;
}
輸出:
83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;
用 arr[] 記法宣告 2D 陣列來訪問元素
這個方法使用單陣列分配,使其在程式執行速度上成為一種更有效的方法。因此,我們應該使用 [] 符號和一些算術來訪問元素。當 array 大小變大並且對其元素的計算相當密集時,建議使用此方法。還要注意的是,這種方式的記憶體釋放變得更容易。
#include <iomanip>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::setw;
constexpr int ROW = 4;
constexpr int COL = 6;
int main() {
  int *matrix = new int[ROW * COL];
  for (int i = 0; i < ROW; ++i) {
    for (int j = 0; j < COL; ++j) {
      matrix[j * ROW + i] = rand() % 100;
      cout << setw(2) << matrix[j * ROW + i] << "; ";
    }
    cout << endl;
  }
  delete[] matrix;
  return EXIT_SUCCESS;
}
使用 vector 容器隱式分配動態二維陣列
或者,我們可以使用 vector 容器構建一個動態的二維陣列,不需要手動分配記憶體。在這個例子中,我們初始化一個 4x6 的 vector_2d 陣列,每個元素的值為 0。這個方法最好的部分是基於範圍的迴圈迭代的靈活性。
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
constexpr int ROW = 4;
constexpr int COL = 6;
int main() {
  vector<vector<int> > vector_2d(ROW, vector<int>(COL, 0));
  for (auto &item : vector_2d) {
    for (auto &item1 : item) {
      item1 = rand() % 100;
      cout << setw(2) << item1 << "; ";
    }
    cout << endl;
  }
  return EXIT_SUCCESS;
}
        Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
    
作者: Jinku Hu
    
