在c++++中動(dòng)態(tài)創(chuàng)建二維數(shù)組有兩種常見方法:指針數(shù)組和連續(xù)內(nèi)存分配。1. 指針數(shù)組通過t*實(shí)現(xiàn),先分配行指針數(shù)組,再逐行分配內(nèi)存,靈活但內(nèi)存不連續(xù),適合不規(guī)則數(shù)組;2. 連續(xù)內(nèi)存分配一次性申請(qǐng)rowscols大小的空間,通過計(jì)算索引訪問元素,內(nèi)存連續(xù)利于緩存優(yōu)化,適合性能敏感場(chǎng)景。選擇取決于是否需要每行不同長(zhǎng)度與對(duì)訪問效率的需求,現(xiàn)代c++推薦使用std::vector以避免手動(dòng)管理帶來的風(fēng)險(xiǎn)。
在C++中動(dòng)態(tài)創(chuàng)建二維數(shù)組,常見的方法有兩種:指針數(shù)組和連續(xù)內(nèi)存分配。它們各有優(yōu)缺點(diǎn),適用于不同場(chǎng)景。選擇哪種方式,主要取決于你對(duì)內(nèi)存布局、訪問效率以及代碼維護(hù)性的要求。
指針數(shù)組:靈活但內(nèi)存不連續(xù)
這種方式是通過一個(gè)指向指針的指針(T**)來實(shí)現(xiàn)的二維數(shù)組結(jié)構(gòu)。每個(gè)一級(jí)指針指向一個(gè)獨(dú)立的一維數(shù)組。
實(shí)現(xiàn)步驟:
- 先為行指針分配空間(即一個(gè)指針數(shù)組)
- 然后為每一行分別分配內(nèi)存
int rows = 5, cols = 10; int **arr = new int*[rows]; for(int i = 0; i < rows; ++i) { arr[i] = new int[cols]; }
特點(diǎn)與適用場(chǎng)景:
- ? 優(yōu)點(diǎn):分配靈活,每行可以不同長(zhǎng)度(適合不規(guī)則數(shù)組)
- ? 缺點(diǎn):
- 內(nèi)存不是連續(xù)的,不利于緩存優(yōu)化
- 分配和釋放都比較繁瑣,容易出錯(cuò)或造成內(nèi)存泄漏
- 需要多次調(diào)用 new 和 delete[]
釋放時(shí)也要逐行刪除:
立即學(xué)習(xí)“C++免費(fèi)學(xué)習(xí)筆記(深入)”;
for(int i = 0; i < rows; ++i) { delete[] arr[i]; } delete[] arr;
連續(xù)內(nèi)存分配:高效但操作稍復(fù)雜
這種做法是一次性申請(qǐng)一塊連續(xù)的內(nèi)存空間,模擬二維數(shù)組的效果,常用于需要性能優(yōu)化的場(chǎng)景。
實(shí)現(xiàn)方式:
- 使用單個(gè)指針,通過計(jì)算偏移量訪問元素
- 或者使用類型別名簡(jiǎn)化訪問方式
int rows = 5, cols = 10; int *arr = new int[rows * cols];
訪問方式:
arr[i * cols + j] = value;
或者更清晰一些的做法:
using Row = int[cols]; // C++11 及以上支持這種方式 Row& arr = *(reinterpret_cast<Row*>(new int[rows * cols])); // 使用 arr[i][j]
特點(diǎn)與適用場(chǎng)景:
- ? 優(yōu)點(diǎn):
- 內(nèi)存連續(xù),訪問速度快,利于CPU緩存
- 只需一次分配和釋放,管理簡(jiǎn)單
- ? 缺點(diǎn):
- 行列長(zhǎng)度固定,不能像指針數(shù)組那樣每行不一樣長(zhǎng)
- 訪問方式略顯麻煩(除非用類型技巧)
釋放也很簡(jiǎn)單:
delete[] arr;
如何選擇?
這要看你的具體需求:
- 如果你需要靈活性,比如每行長(zhǎng)度可能不同,或者頻繁修改某一行的數(shù)據(jù)結(jié)構(gòu),那應(yīng)該選指針數(shù)組
- 如果你更關(guān)注性能,尤其是進(jìn)行大量數(shù)值運(yùn)算(如圖像處理、矩陣計(jì)算),那更適合使用連續(xù)內(nèi)存分配
另外,在現(xiàn)代C++中,也可以考慮使用 std::vector<:vector>> 或 std::vector
基本上就這些。兩種方法都不復(fù)雜,但在實(shí)際使用中很容易因?yàn)榧?xì)節(jié)處理不當(dāng)而引發(fā)問題,比如忘記釋放內(nèi)存或多維數(shù)組越界等。