如何在没有 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?
不,除非如果你真的知道自己在做什么。
有很多理由不做你想做的事。您正在使用 c++, 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 并删除空槽。
这是在我的计算基础 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?
不,除非如果你真的知道自己在做什么。
有很多理由不做你想做的事。您正在使用 c++, 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 并删除空槽。