อาร์เรย์ 2 มิติแบบไดนามิกในพื้นฐานคืออาร์เรย์ของ pointer ที่ชี้ไปยังอาร์เรย์ นี่คือแผนภาพของอาร์เรย์ 2 มิติขนาด 3x4
อัลกอริธึม
- ประกาศมิติของอาร์เรย์
- จัดสรรอาร์เรย์ 2 มิติ
a[][]แบบไดนามิกด้วยnew - เติมค่าลงในอาร์เรย์
- พิมพ์อาร์เรย์
- ลบหน่วยความจำเพื่อคืนระบบ
โค้ดตัวอย่าง
#include <iostream>
using namespace std;
int main() {
int B = 4; // rows
int A = 5; // cols
// จัดสรรอาร์เรย์ pointer ขนาด B (rows)
int** a = new int*[B];
// จัดสรรแต่ละ row ขนาด A (cols)
for(int i = 0; i < B; ++i)
a[i] = new int[A];
// ใส่ค่า
for(int i = 0; i < B; ++i)
for(int j = 0; j < A; ++j)
a[i][j] = i;
// พิมพ์
for(int i = 0; i < B; ++i)
for(int j = 0; j < A; ++j)
cout << a[i][j] << "\n";
// ลบ: ต้องลบแต่ละ row ก่อน แล้วค่อยลบอาร์เรย์ pointer หลัก
for(int i = 0; i < B; ++i)
delete[] a[i];
delete[] a;
return 0;
}
ผลลัพธ์
0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
โครงสร้างหน่วยความจำ:
aชี้ไปยังบล็อก pointer ขนาด B (บน heap)- แต่ละ
a[i]ชี้ไปยังบล็อก int ขนาด A (บน heap แยกกัน) - หน่วยความจำ ไม่ต่อเนื่อง ระหว่างแถว (non-contiguous rows)
ทางเลือกที่หน่วยความจำต่อเนื่อง (Contiguous):
// จัดสรรบล็อกเดียวขนาด B*A
int* flat = new int[B * A];
auto a = [flat, A](int i, int j) -> int& { return flat[i * A + j]; };
// ใช้ a(i,j) แทน a[i][j]
delete[] flat; // ลบครั้งเดียว
แนะนำ: ใช้ std::vector<std::vector<int>> หรือ std::vector<int> แบบ flat + index calculation หรือ std::mdspan (C++23)