无论如何要测试c中 2维int数组的第一个空值?
在我当前的程序中,我在主程序(while循环)之前使用2 for循环将我的2维数组的所有值设置为-9999。然后在我的主while循环中,我测试第一个-9999值并将其设置为一个值,然后使用break从中退出。
使用这个我设法做了我的任务,但我不是很满意,因为我认为可能有更好的解决方案。
有吗?
编辑:自您提出要求以来的代码。
循环外循环:
for(int x=0;x<ctr-1;x++)
{
for(int y=0;y<maxtrips;y++)
{
EmployeeKilos[x][y] = -9999; // Set all the kilos to -9999 to signify emptiness.
}
}
在我的主要while循环中:
for(int x=0;x<ctr-1;x++) // and set it to the log kilometers
{
if(employeenames[x].EmployeeNumber == log.Record)
{
for(int y=0;y<maxtrips;y++)
{
if(EmployeeKilos[x][y] == -9999)
{
EmployeeKilos[x][y] = log.Kilometers;
break;
}
}
}
}
我的所有代码:http://pastebin.com/Zb60mym8
答案 0 :(得分:1)
正如Dave所说,检查空值不能比线性时间(O(n))更有效,但我的回答集中在可以防止必须首先查找它的解决方案强>
通常,您可以在行主模式或列主模式下迭代矩阵。
实际上,您可以使用单个索引转换为矩阵单元格,如此
for (size_t i=0; i<ROWS*COLS; ++i)
{
int row = i / ROWS;
int col = i % ROWS;
// work with matrix[row][col]
}
这样你就可以存储并记住你上次找到第一个空单元格的i的值,这样你就不必从头重新开始了。
如果您实际上对row
/ col
寻址不感兴趣,可以忘掉这些并只使用输出迭代器来跟踪当前的输出位置。
这是一个使用'iterator'风格的演示(借用c ++,但完全是C99)
typedef int data;
typedef data* output;
output add_next(data matrix[ROWS][COLS], output startpoint, data somevalue)
{
if (output < (matrix + ROWS*COLS))
*(output++) = somevalue;
return output;
}
现在你可以说:
add_next(matrix, 42);
add_next(matrix, 9);
注意输出迭代器事物假定连续存储,因此不能用于所谓的jagged arrays
HTH
答案 1 :(得分:0)
您可以使用memset将数组初始化为固定值 - 它比迭代数组更有效,更清晰。
尽管如此,检查“空”值的速度要快得多。 :)
答案 2 :(得分:0)
这听起来像你应该考虑你的数据类型。因为你已经在使用结构。为什么不为最后一个未赋值的值添加另一个int,所以你只需循环它。就像是 e.g:
struct t_EmployeeKilos{
int kilos[maxtrips];
int nlast;
} EmployeeKilos[N];
每当你以千克为单位分配一个新元素时,并设置nlast。这样就是O(1)。
for(int x=0;x<ctr-1;x++) //
{
if(employeenames[x].EmployeeNumber == log.Record)
{
EmployeeKilos[x].kilos[EmployeeKilos[x].nlast] = log.Kilometers;
EmployeeKilos[x].nlast++;
}
}