基于代理的二维数组

题目描述

补全二维数组类 Array2D 的定义,使得二维数组 a 可以通过 a[i][j] 访问其中的元素。

:在 C++ 23 后,更推荐定义多维的 operator[],从而使用 a[i, j] 访问其中的元素。

关于输入

关于输出

参考答案

#include <iostream>
#include <random>
#include <cassert>

class Array2D {
    int* data;
    int w;

public:
    int& at(int x, int y) {
        return data[x * w + y];
    }
    
    Array2D(int h, int w)
        : w{w}, data{new int[h * w]{}} {}

    int* operator[](int i) {
        return data + i * w;
    }

    ~Array2D() {
        delete[] data;
    }
};

// C++ 风格的随机数生成函数,不用深究
int rand() {
    static std::random_device rd;
    static std::default_random_engine e(rd());
    return int(e());
}

int main() {
    int h{3}, w{4};
    Array2D a(h, w);
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            a.at(i, j) = rand();
        }
    }
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            // assert:如果条件不成立,则运行时错误
            assert(a.at(i, j) == a[i][j]);
        }
    }
}












 
 
 
 
 
 
 
 
 
 
 
























#include <iostream>
#include <random>
#include <cassert>

class Array2D {
    int* data;
    int w;

public:
    int& at(int x, int y) {
        return data[x * w + y];
    }
    
    Array2D(int h, int w)
        : w{w}, data{new int[h * w]{}} {}

    struct Array1D {
        Array2D* parent;
        int x;

        int& operator[](int y) {
            return parent->at(x, y);
        }
    };

    Array1D operator[](int x) {
        return Array1D{this, x};
    }

    ~Array2D() {
        delete[] data;
    }
};

// C++ 风格的随机数生成函数,不用深究
int rand() {
    static std::random_device rd;
    static std::default_random_engine e(rd());
    return int(e());
}

int main() {
    int h{3}, w{4};
    Array2D a(h, w);
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            a.at(i, j) = rand();
        }
    }
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            // assert:如果条件不成立,则运行时错误
            assert(a.at(i, j) == a[i][j]);
        }
    }
}