(注意:我目前正在学习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做到这一点,我更喜欢。
答案 0 :(得分:3)
这里没有真正的理由来打扰数组。要正确维护和销毁这项工作要多得多,特别是因为您已经避免使用可以为您处理大量内存管理的标准库容器。
通常更容易在单个数组中分配width * height
个单元格并引用它们,例如cell[x + width * y]
,其中x
是您的列,y
是您的行。
请记住,在这个问题的特定情况下,你想要的是一个位数组而不是一个布尔数组。 C ++确实有special case container for a bitset值得使用:std::vector<bool>
。
答案 1 :(得分:1)
这有效:
int arr1[10][10],arr2[10][10]
//Swap 2nd row between arrays
std::swap(arr1[2], arr2[2]);
答案 2 :(得分:0)
如果是C ++使用std::vector
并忘记堆分配,纯数组,memcpy和复制/赋值运算符。
答案 3 :(得分:0)
为什么不使用大小为width*height
的一维数组,而不是使用数组数组?
只需按y*width + x
访问您的元素即可。
使用malloc(width*height*sizeof(bool))
照常分配数组。这应该足以解决您的问题
答案 4 :(得分:0)
虽然早期的答案在技术上是正确的,但它们似乎没有回答您原来的问题。你说“这种方法不像二维数组那样有效”,但为什么以下不起作用呢?
void () {
bool ** temp = current;
current = previous;
previous = temp;
}
如果你不介意使用c ++特性,那么std :: swap函数就派上用场了:
std::swap(current, previous);