2

(注意:我目前正在学习 C++,所以如果有更好的方法来做我正在做的事情,解释会很有帮助。)

我正在用 C/C++ 制作康威的生命游戏,并有以下代码:

bool ** previous;
bool ** current;

void init() {
    previous = new bool*[width];
    current = new bool*[width];
    for (int i =0; i < width; i++) {
        previous[i] = new bool[height];
        current[i] = new bool[height];
    }
}

动态数组的原因是宽度和高度由用户在运行时给出。如果我有一维数组,我可以执行以下操作:

bool * previous;
bool * current;

void () {
    bool * temp = current;
    current = previous;
    previous = temp;
}

但是,这种方法在二维数组中并不如所希望的那样工作。由于它在技术上是一个数组数组,我是否必须单独交换每个子数组指针?有没有更好的方法来定义多维数组并交换它们?

编辑:我还没有真正使用任何 C++ 特定的功能,所以如果我可以在纯 C 中做到这一点,我更喜欢那个。

4

5 回答 5

3

这里没有真正的理由打扰数组数组。正确维护和销毁需要大量的工作,尤其是当您避免使用标准库容器来为您处理大量内存管理时。

通常更容易width * height在单个数组中分配单元格并引用它们,就像你的列cell[x + width * y]在哪里,你的行在哪里。xy

请记住,在此问题的特定情况下,您想要的是位数组而不是布尔数组。C++ 确实有一个值得使用的位集的特殊情况容器std::vector<bool>: .

于 2012-11-02T14:30:48.517 回答
1

这有效:

int arr1[10][10],arr2[10][10]

//Swap 2nd row between arrays
std::swap(arr1[2], arr2[2]);
于 2013-04-19T17:22:15.377 回答
0

虽然早期的答案在技术上是正确的,但它们似乎并没有回答你原来的问题。您说“这种方法对二维数组不起作用”,但为什么以下方法不起作用?

void () {
    bool ** temp = current;
    current = previous;
    previous = temp;
}

如果您不介意使用 c++ 功能,那么 std::swap 函数会派上用场:

std::swap(current, previous);
于 2012-11-03T00:02:24.140 回答
0

如果它是 C++ 使用std::vector's 并忘记堆分配、纯数组、memcpy 和复制/赋值运算符。

于 2012-11-02T14:28:30.873 回答
0

为什么不使用数组的数组,而不是使用 size 的一维数组width*height

只需通过 访问您的元素y*width + x

像往常一样使用 分配数组malloc(width*height*sizeof(bool))。这应该足以解决您的问题

于 2012-11-02T14:30:31.530 回答