如何在 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;
}
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