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

标签 c++ arrays traveling-salesman

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

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

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

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

例子:

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

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

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

最佳答案

Can you?

是的,通过使用 realloc() .

Should you?

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


有很多理由不做您想做的事。您正在使用 ,因此 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并删除空槽。

关于c++ - 如何在没有 STL 的情况下从二维数组中删除任何未填充的插槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36345681/

相关文章:

c++ - namespace 和类之间的主要区别是什么?

c++ - 发送儿子而不是父亲的对象

c++ - 在 c/c++ 中寻找开源旅行推销员函数/库?

algorithm - 旅行推销员建设性启发法

c++ - 线程完成后删除Qt Thread中的对象

c++ - eclipse CDT 8.01 - 默认路径(libstdc、libstdc++)在 'includes' 目录中完全消失

java - 要求用户输入数组中的项目数量

arrays - 为什么堆栈溢出取决于Go中如何访问数组?

java - 大于 64 位的快速位掩码

java - 简单的爬山算法?