C++用new建立二維陣列的方法
問題來源
在C++中,陣列可以被視為一種型別——但是,不存在‘二維陣列’這種型別。二維陣列本身會被解釋成一個一維陣列:這個陣列的元素型別為另一種一維陣列。比如int[2][3]這個二維陣列,它會被編譯器視作一個元素型別為‘int[3]’的一維陣列。並且,‘int[3]’和'int[4]'會被當成不同的資料型別。
假設a, b為兩個int型變數,如果你希望這樣生成一個二維陣列:new int[a][b],是不會得到編譯器允許的——因為你沒有指定這個陣列的元素型別。由於b的大小未知,編譯器無法確定‘int[b]’到底是一個什麼型別。所以,要用new建立一個二維陣列,這其中有講究。
方法一:使用常量
接上:如果將b指定為一個常量,例如new int[a][5],其實質與new int[a]建立一個動態陣列並無多大區別——只是元素型別由int變為了'int[5]'而已。
示例程式碼:
void TestFunc_(unsigned int n)
{
unsigned int i, j;
// 元素型別為‘int[5]’的陣列,可賦值給‘int[5]’型別的指標.
int (* array2D)[5] = new int[n][5];
for(i=0; i<n; ++i)
{
for(j=0; j<5; ++j)
{
array2D[i][j] = i * 5 + j;
}
}
// 回收方法和普通動態陣列相同,使用'delete[]'即可
delete[] array2D;
}
用這個方法來建立二維陣列,比較直觀、易用,但它最大的限制在於:你必須在編譯時確定b的大小。
方法二:使用指標間接引用
首先建立若干個大小一致的動態陣列,然後將這些陣列的首地址(轉化為指標)按順序儲存到一個動態陣列中,就相當於模擬了一個二維動態陣列。
示例程式碼:
void TestFunc_pointer(unsigned int height, unsigned int width)
{
unsigned int i, j;
// 陣列的元素型別為‘int *’,可賦值給指向‘int *’的指標.
int **array2D = new int *[height];
for(i=0; i<height; ++i)
{
array2D[i] = new int[width];
}
// 訪問.
for(i=0; i<height; ++i)
{
for(j=0; j<width; ++j)
{
// 記憶體非連續,注意防止越界.
array2D[i][j] = i * width + j;
}
}
// 首先回收低一級的動態陣列.
for(i=0; i<height; ++i)
{
delete[] array2D[i];
}
// 然後回收高一級的動態陣列.
delete[] array2D;
}
這個方法實現了兩個維度的動態建立,訪問也比較方便。但是有一個缺點:由於低一級的陣列是分開建立的,所以整個二維陣列的記憶體不連續——類似‘array2D[i * width + j]’這樣的訪問就不要使用了,容易造成訪問越界。
方法三:使用vector
藉助STL中的vector,我們可以很直觀的建立一個二維陣列,而不需要用到基本陣列的概念。
示例程式碼:
void TestFunc_vector(unsigned int height, unsigned int width)
{
typedef std::vector<int> IntVector;
typedef std::vector<IntVector> IntVector2D;
unsigned int i, j;
IntVector2D *pArray2D = new IntVector2D;
// 動態設定大小.
pArray2D->resize(height);
for(i=0; i<height; ++i)
{
(*pArray2D)[i].resize(width);
}
for(i=0; i<height; ++i)
{
for(j=0; j<width; ++j)
{
(*pArray2D)[i][j] = i * width + j;
}
}
delete pArray2D;
}
可以看到,在vector這個‘更高階’的陣列幫助下,我們能夠很輕易的建立二維陣列。稍微美中不足的是由於引入了STL,程式會變得更大一些——但基本不影響執行速度。
==========================End============================
原文:https://blog.csdn.net/samuelcoulee/article/details/8674388
相關文章
- C++ 使用 new 建立二維陣列C++陣列
- C++動態建立二維陣列,二維陣列指標,以及動態二維陣列函式傳遞C++陣列指標函式
- C/C++ 二維陣列的理解(多維陣列)C++陣列
- 快速建立空二維陣列陣列
- Kotlin建立二維Int陣列Kotlin陣列
- JavaSE 陣列:一維陣列&二維陣列Java陣列
- c++ -- 二維陣列引數傳遞C++陣列
- C++中動態建立和刪除陣列(new 和delete)C++陣列delete
- php二維陣列改鍵名的方法PHP陣列
- 二維陣列陣列
- js 一維陣列轉二維陣列JS陣列
- js 二維陣列轉一維陣列JS陣列
- PHP二維陣列轉一維陣列PHP陣列
- C/C++獲取二維陣列行列數C++陣列
- PHP中二維陣列與多維陣列PHP陣列
- JavaScript --二維陣列查詢一維陣列JavaScript陣列
- 用三列二維陣列表示的稀疏矩陣類陣列矩陣
- vector 二維陣列陣列
- Java二維陣列Java陣列
- JavaScript二維陣列JavaScript陣列
- JavaScript 二維陣列JavaScript陣列
- JavaScript二維陣列轉換成一維陣列JavaScript陣列
- ***PHP陣列排序+php二維陣列排序方法(PHP比較器)PHP陣列排序
- 二維陣列的計算陣列
- C++ 練氣期之二維陣列與矩陣運算C++陣列矩陣
- php中使用while遍歷二維陣列的方法PHPWhile陣列
- 【C++】C++用new和不用new建立類物件區別C++物件
- 求二維陣列中最大子陣列的和陣列
- java之陣列的索引,排序以及二維陣列Java陣列索引排序
- 二維陣列和稀疏陣列互轉陣列
- C++容器巢狀實現動態二維陣列C++巢狀陣列
- 二維陣列查詢陣列
- php 二維陣列排序PHP陣列排序
- 二維陣列行排序陣列排序
- perl操作二維陣列陣列
- 二維陣列傳參陣列
- 二維樹狀陣列陣列
- Java 二維陣列轉一維Java陣列