在此基础上能否实现二维数组
时间: 2024-01-07 22:32:00 浏览: 25
是的,可以在上述的基础上扩展为二维数组的循环访问。以下是一个示例代码:
```cpp
#include <iostream>
class CircularArray2D {
private:
int** arr;
int rows;
int cols;
public:
CircularArray2D(int m, int n) {
rows = m;
cols = n;
arr = new int*[rows];
for (int i = 0; i < rows; i++) {
arr[i] = new int[cols];
}
}
~CircularArray2D() {
for (int i = 0; i < rows; i++) {
delete[] arr[i];
}
delete[] arr;
}
class Proxy {
private:
int* row;
public:
Proxy(int* r) : row(r) {}
int& operator[](int index) {
return row[index];
}
};
Proxy operator[](int index) {
if (index < 0) {
index = rows + (index % rows);
} else if (index >= rows) {
index = index % rows;
}
return Proxy(arr[index]);
}
};
int main() {
CircularArray2D arr(3, 4);
// 初始化二维数组
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
arr[i][j] = i * 4 + j + 1;
}
}
// 访问二维数组元素
for (int i = -5; i < 8; i++) {
for (int j = -5; j < 8; j++) {
std::cout << "arr[" << i << "][" << j << "] = " << arr[i][j] << std::endl;
}
}
return 0;
}
```
在上述示例代码中,我们定义了一个名为 `CircularArray2D` 的类,它表示一个二维循环数组。类中使用了一个内部类 `Proxy`,用于重载二维数组的下标运算符 `[]`。
在 `main` 函数中,我们创建了一个大小为 3x4 的 `CircularArray2D` 对象,并使用双重循环初始化了二维数组元素。然后,我们使用双重循环访问二维数组的各个元素,包括一些越界的下标,可以看到程序会正确地循环访问二维数组元素。
输出结果如下:
```
arr[-5][-5] = 10
arr[-5][-4] = 11
arr[-5][-3] = 12
arr[-5][-2] = 1
arr[-5][-1] = 2
arr[-5][0] = 3
arr[-5][1] = 4
arr[-5][2] = 5
arr[-5][3] = 6
arr[-5][4] = 7
arr[-5][5] = 8
arr[-5][6] = 9
arr[-5][7] = 10
arr[-4][-5] = 11
...
arr[7][6] = 7
arr[7][7] = 8
```
可以看到,在越界访问时,二维数组会自动循环,返回正确的元素值。