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

Jinku Hu 2023年1月30日 2020年10月15日
  1. arr[x][y] 記法宣告二維陣列來訪問元素
  2. arr[] 記法宣告 2D 陣列來訪問元素
  3. 使用 vector 容器隱式分配動態二維陣列
如何在 C++ 中使用 new 宣告 2D 陣列

本文介紹了用 new 動態宣告二維陣列的多種 C++ 方法。

arr[x][y] 記法宣告二維陣列來訪問元素

此方法利用 new 關鍵字,使生成的矩陣結構可以使用陣列符號–[x][y] 進行訪問。首先,我們宣告指向整數(int **)變數的指標,並在陣列中分配行大小的 int 指標陣列。接下來,我們遍歷該指標陣列,並在每次迭代中分配列大小的 int 陣列。最後,當我們完成二維陣列操作後,我們需要釋放分配的記憶體。注意,釋放是在逆序迴圈中完成的。

#include <iostream>
#include <iomanip>

using std::cout; using std::cin;
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 <iostream>
#include <iomanip>

using std::cout; using std::cin;
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 <iostream>
#include <vector>
#include <iomanip>

using std::cout; using std::vector;
using std::endl; using std::setw;

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;
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Array