如何在没有 STL 的情况下从二维数组中删除任何未填充的插槽?

How to remove any unfilled slots from a 2d array without the STL?

这是在我的计算基础 Class 中分配给我的旅行销售计划。 class 中的一项规则是,除了我们的教授告诉我们的每个单独作业之外,不允许以任何方式使用 STL。在这种情况下,我们可以使用 string.

我当前的问题是创建动态数量的 cities/routes。我的计划是创建一个 13 x 13 的数组,然后删除所有未使用的元素。在 Java 这没什么大不了的,但在 C++ 中我发现它很难解决。(不使用矢量)

有没有办法(不在 STL 中使用 vector/anything)从数组中删除任何未填充的槽?换句话说,减少数组的大小,直到它到达第一个已被占用的插槽?

另一种解决方案是创建一个动态大小的数组,但是 google 和 cplusplus.com 告诉我如果不使用向量就无法做到这一点。

示例:

int matrix [13][13] = {};

for (int i = 0; i < 12; i++){
  matrix [i][i] = 4;
}

那会给我留下插槽 [12][13] 和 [13][13] 等..空的我如何删除任何空的插槽?

Can you?

是的,通过使用 realloc()

Should you?

不,除非如果你真的知道自己在做什么


有很多理由不做你想做的事。您正在使用 , thus an std::vector 应该改用。此外,realloc() 可能需要复制您正在创建的所有新数组(但这只是为了增加数组的大小)。


how to have a dynamic amount of cities/routes?

标记数组的空槽(或简单地将它们留空),以便在处理步骤中忽略它们。

示例:

假设你想求矩阵所有元素的和,但忽略所有等于4的元素,那么你可以这样做:

#include <iostream>

int main() {
        int matrix[13][13] = {0};
        for (int i = 0; i < 12; i++) {
                matrix[i][i] = 4;
        }
        // we want to sum all the elements
        // except the "emptyslots" (= 4)
        int sum = 0;
        for(int i = 0; i < 13; ++i)
                for(int j = 0; j < 13; ++j)
                        if(matrix[i][j] != 4)  // ignore empty slots!!
                                sum += matrix[i][j];
        std::cout << sum << std::endl;
        return 0;
}

输出:

gsamaras@gsamaras:~$ g++ -Wall px.cpp 
gsamaras@gsamaras:~$ ./a.out 
0        <-- as expected, since we initialized the matrix to 0

另一种解决方案是使用 simple linked list 并删除空槽。