引言:在計算機編程領域,二維動態數組是一種能夠在程序運行期間動態調整其大小的二維數組數據結構。它與靜態二維數組的關鍵區別在于,靜態二維數組在編譯時就需要確定其大小,而二維動態數組的大小可以在程序運行過程中根據實際需求進行靈活調整。
下面以楊輝三角為例來講解一下動態二維數組的底層:
// 以楊輝三角的前n行為例:假設n為5 void test2vector(size_t n) {// 使用vector定義二維數組vv,vv中的每個元素都是vector<int>aramae::vector<aramae::vector<int>> vv(n);// 將二維數組每一行中的vecotr<int>中的元素全部設置為1for (size_t i = 0; i < n; ++i)vv[i].resize(i + 1, 1);// 給楊輝三角出第一列和對角線的所有元素賦值for (int i = 2; i < n; ++i){for (int j = 1; j < i; ++j){vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];}} }
aramae::vector<aramae::vector<int>> vv(n); 構造一個vv動態二維數組,vv中總共有n個元素,每個元素都是vector類 型的,每行沒有包含任何元素,如果n為5時如下所示:
例題:楊輝三角 之內存分配 C/C++?
118. 楊輝三角
給定一個非負整數?
numRows
,生成「楊輝三角」的前?numRows
?行。在「楊輝三角」中,每個數是它左上方和右上方的數的和。
示例 1:
輸入: numRows = 5 輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例?2:
輸入: numRows = 1 輸出: [[1]]
1. C 語言實現的動態內存分布
在 C 語言中,楊輝三角通常用二維指針數組實現,內存分配分為兩個步驟:
int** generate(int numRows, int* returnSize, int** returnColumnSizes) {// 1. 分配行指針數組int** triangle = (int**)malloc(numRows * sizeof(int*));*returnSize = numRows;*returnColumnSizes = (int*)malloc(numRows * sizeof(int));// 2. 為每行分配元素數組for (int i = 0; i < numRows; i++) {(*returnColumnSizes)[i] = i + 1;triangle[i] = (int*)malloc((i + 1) * sizeof(int));// ... 初始化元素 ...}return triangle;
}
內存布局示意圖?
triangle指針 行指針數組 每行的元素數組
┌───────┐ ┌───────┐ ┌───────┐
│ 0x100 │─────────?│ 0x200 │─────────?│ 1 │ 第0行
└───────┘ ├───────┤ └───────┘│ 0x300 │─────────?│ 1 │ 第1行├───────┤ ├───────┤│ 0x400 │─────────?│ 1 │ 第2行├───────┤ ├───────┤│ ... │ │ 2 │└───────┘ ├───────┤│ 1 │└───────┘...
代碼實現:
#include <stdio.h> #include <stdlib.h>int** generate(int numRows, int* returnSize, int** returnColumnSizes) {// 分配二維數組的內存,存儲楊輝三角的每一行int** triangle = (int**)malloc(numRows * sizeof(int*));*returnSize = numRows;*returnColumnSizes = (int*)malloc(numRows * sizeof(int));for (int i = 0; i < numRows; i++) {// 每一行有i+1個元素(*returnColumnSizes)[i] = i + 1;triangle[i] = (int*)malloc((i + 1) * sizeof(int));// 每行的首尾元素為1triangle[i][0] = 1;triangle[i][i] = 1;// 計算中間元素的值for (int j = 1; j < i; j++) {triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];}}return triangle; }int main() {int numRows = 5;int returnSize;int* returnColumnSizes;int** triangle = generate(numRows, &returnSize, &returnColumnSizes);// 打印楊輝三角for (int i = 0; i < returnSize; i++) {for (int j = 0; j < returnColumnSizes[i]; j++) {printf("%d ", triangle[i][j]);}printf("\n");// 釋放每行的內存free(triangle[i]);}// 釋放二維數組和列大小數組的內存free(triangle);free(returnColumnSizes);return 0; }
?2. C++ vector 實現的動態內存分布
C++ 的vector<vector<int>>
實現方式更簡潔,但內存布局類似:
vector<vector<int>> generate(int numRows) {vector<vector<int>> triangle(numRows);for (int i = 0; i < numRows; i++) {triangle[i].resize(i + 1);// ... 初始化元素 ...}return triangle;
}
?內存布局示意圖
triangle對象 外層vector數據 每行的vector數據
┌───────────┐ ┌───────────┐ ┌───────────┐
│ size: 5 │ │ 0x300 │ │ capacity:1│
│ capacity:5│ ├───────────┤ ├───────────┤
│ data:0x200│───────?│ 0x400 │ │ size:1 │
└───────────┘ ├───────────┤ │ data:0x300││ 0x500 │ └───────────┘├───────────┤ ┌───────────┐│ 0x600 │ │ capacity:2│├───────────┤ ├───────────┤│ 0x700 │ │ size:2 │└───────────┘ │ data:0x400│└───────────┘...
代碼實現:
class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> vv;vv.resize(numRows);for(int i = 0; i < numRows;++i){vv[i].resize(i+1);vv[i][0]= vv[i][i]=1;for(int j = 1;j < i;j++){vv[i][j] = vv[i-1][j-1] + vv[i-1][j];}}return vv;} };