Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีประกาศอาร์เรย์ 2 มิติแบบไดนามิกใน C++ ด้วย new

อาร์เรย์ 2 มิติแบบไดนามิกในพื้นฐานคืออาร์เรย์ของ pointer ที่ชี้ไปยังอาร์เรย์ นี่คือแผนภาพของอาร์เรย์ 2 มิติขนาด 3x4

อัลกอริธึม

  1. ประกาศมิติของอาร์เรย์
  2. จัดสรรอาร์เรย์ 2 มิติ a[][] แบบไดนามิกด้วย new
  3. เติมค่าลงในอาร์เรย์
  4. พิมพ์อาร์เรย์
  5. ลบหน่วยความจำเพื่อคืนระบบ

โค้ดตัวอย่าง

#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)