【问题标题】:Swap multi-dimensional arrays in C++在 C++ 中交换多维数组
【发布时间】:2012-11-02 14:21:45
【问题描述】:

(注意:我目前正在学习 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 中做到这一点,我会更喜欢。

【问题讨论】:

  • 我只是在您评论时添加了一条注释。在我学习的过程中,两者的答案对我(以及在搜索中偶然发现这个问题的任何人)来说都是最有用的,但我主要关注 C。
  • 没有 C/C++ 这样的东西。正如丹尼斯所说,要么是一个,要么是另一个。如果您正在“学习 C++”,我不知道您为什么要为此使用纯 C。
  • 我们一直在学习 C++,现在正在学习 C(C++ 然后是 C,因为它更接近于 Java,这是他们去年教给我们的)。我们可以在这个任务中使用任何一个(我正在通过制作一个二维元胞自动机来扩展它)。
  • 在 C++ 中,可以像这样在一行中实现交换:cplusplus.com/reference/algorithm/swap 不过,这可能不是您想要的,因为它“涉及复制构造和两个赋值操作”,这可能很昂贵。
  • 问题在于 C++ 不仅仅是具有“C++ 特定特性”的 C。是的,许多语言特性源自 C,并且包含了整个 C 库,但是编写 C++ 需要了解该语言的习语和最佳实践。有许多新的更好的方法可以做你可以用 C 做的事情,事实上,语言的许多基础知识多年来已经发展和变化,使其与 C 不兼容。你真正想要的是类似 C 的 C++ 但给出这样的答案确实对任何人都没有帮助。但是,如果您想要 C 答案 C++ 答案,我们可以做到。

标签: c++ c pointers multidimensional-array


【解决方案1】:

这里没有真正的理由去麻烦数组数组。正确维护和销毁需要大量工作,尤其是在您避免使用标准库容器来处理大量内存管理的情况下。

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

请记住,在这个问题的特定情况下,您需要的是位数组而不是布尔数组。 C++ 确实有一个值得使用的special case container for a bitsetstd::vector&lt;bool&gt;

【讨论】:

  • @MihaiTodor 我一直在使用数组,因为这样会更容易将它们更改为例如字符并允许单元格具有许多不同的状态(例如,年龄),但是是的,如果我使用的是一维布尔数组,那么 bitset 将是完美的,并且它们已经在项目中使用。编辑:实际上,位集在这里不起作用,因为它们不允许动态大小。
  • 如果您需要动态尺寸,您可能从错误的角度来处理这个问题。 “生命游戏”的实现需要一个潜在的无限区域或一个环绕的区域。要处理可扩展区域,您应该将该区域划分为固定大小的区域。每次都进行分配和解除分配是对资源的严重浪费。
【解决方案2】:

这行得通:

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

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

【讨论】:

    【解决方案3】:

    如果是 C++,请使用 std::vector 并忘记堆分配、纯数组、memcpy 以及复制/赋值运算符。

    【讨论】:

    • 并致电std::vector::swap
    【解决方案4】:

    与其使用数组数组,不如使用大小为width*height 的一维数组?

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

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

    【讨论】:

      【解决方案5】:

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

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

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

      std::swap(current, previous);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-26
        • 2021-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多