在C 中交换多维阵列

Swap multi-dimensional arrays in C++

本文关键字:阵列 交换      更新时间:2023-10-16

(注意:我目前正在学习C ,因此,如果有更好的方法来做我正在做的事情,解释将是有帮助的。)

我正在用C/C 制作Conway的生活游戏,并具有以下代码:

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中这样做,我更喜欢。

这里没有真正的理由来打扰一系列数组。正确维护和破坏还有更多的工作,尤其是当您避免使用标准库容器时,该容器可以为您处理许多内存管理。

通常更容易在单个数组中分配width * height单元格,并像cell[x + width * y]一样引用x是您的列,y是您的行。

请记住,在此问题的特定情况下,您想要的是一系列碎片,而不是一系列布尔人。C 确实有一个值得使用的比特集的特殊情况容器: std::vector<bool>

这有效:

int arr1[10][10],arr2[10][10]
//Swap 2nd row between arrays
std::swap(arr1[2], arr2[2]);

如果是c 使用std::vector的s,而忘记了堆的分配,纯数组,为它们的memcpy并复制/分配运算符。

而不是使用您的数组数组,为什么不使用大小width*height的一维数组?

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

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

虽然较早的答案在技术上是正确的,但它们似乎没有回答您的原始问题。您说:"这种方法不如二维阵列所希望的那样起作用",但是为什么不工作?

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

如果您不介意使用C 功能std ::交换函数非常方便:

std::swap(current, previous);