Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Mô phỏng mảng 2D bằng mảng 1D trong C++

Trong lập trình, đôi khi ta cần lưu trữ ma trận 2 chiều (2D) vào một mảng 1 chiều (1D) để tối ưu bộ nhớ hoặc tính toán địa chỉ nhanh hơn. Kích thước mảng 1D = rows * cols.

Có 2 cách ánh xạ chỉ số (i, j) của ma trận rows x cols sang chỉ số 1D:

1. Row-Major Order (Theo hàng - Ngôn ngữ C/C++ mặc định)

Lưu toàn bộ hàng 0, rồi hàng 1, ...

Công thức: index_1D = i * cols + j

2. Column-Major Order (Theo cột - Fortran, Matlab mặc định)

Lưu toàn bộ cột 0, rồi cột 1, ...

Công thức: index_1D = j * rows + i

Ví dụ minh họa

Ma trận 3x5 (rows=3, cols=5). Phần tử tại (i=0, j=2).

  • Row-major: 0 * 5 + 2 = 2
  • Col-major: 2 * 3 + 0 = 6

(Lưu ý: Code gốc ví dụ có lỗi logic khai báo mảng 3x5 nhưng gán giá trị 5 hàng. Code dưới đã sửa).

Chương trình minh họa

#include <iostream>
using namespace std;

int main() {
    int rows = 3, cols = 5;
    // Ma trận 3 hàng, 5 cột
    int grid[3][5] = {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15}
    };

    int i = 1, j = 3; // Phần tử grid[1][3] = 9

    // Row-major (C/C++ standard layout)
    int rowMajorIndex = i * cols + j;
    cout << "Row-major index cua (" << i << "," << j << "): " << rowMajorIndex 
         << " (Gia tri: " << grid[i][j] << ")" << endl;

    // Column-major
    int colMajorIndex = j * rows + i;
    cout << "Col-major index cua (" << i << "," << j << "): " << colMajorIndex << endl;

    // Minh họa truy cập mảng 1D
    int flatArray[rows * cols];
    // Copy theo Row-major (memcpy nhanh nhất vì C++ lưu Row-major)
    // Hoặc gán thủ công:
    for(int r=0; rRow-major index cua (1,3): 8 (Gia tri: 9)
Col-major index cua (1,3): 11
Tru cap flatArray[8] = 9