如何在 C++ 中使用 new 宣告 2D 陣列

Jinku Hu 2023年10月12日
  1. arr[x][y] 記法宣告二維陣列來訪問元素
  2. arr[] 記法宣告 2D 陣列來訪問元素
  3. 使用 vector 容器隱式分配動態二維陣列
如何在 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;
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Array