我有一个类似下面的数组
int arr[32];
此数组可包含32个元素 如果我在该数组中添加了一些数据,如下所示
arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;
如您所见,我将数据添加到元素0,1,2,3
中,其他元素仍未初始化或为空。
现在,如何获取仅包含数据的元素?
当前示例中的将获得4个元素。
答案 0 :(得分:3)
你可以用多种方式做到这一点 - 一个是保持初始值的计数器:
arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;
n = 4;
仅当您按顺序填充数组时才有效。
其他方法是使用某些值初始化数组,该值在语义上不能是数组的元素:
int arr[32] = {-1};
之后,您可以检查当前元素是否包含不同于-1
的值。
样本循环可以像这样实现:
for(i = 0; i < 32 && arr[i] != -1; i++)
{
// do things
}
另外,正如@Jongware在评论中指出的那样 - 如果你不介意花费额外空间的O(n) - 你可以有额外的标志数组:
int fill[32] = {0};
arr[0] = 5; fill[0] = 1;
arr[1] = 10; fill[1] = 1;
arr[2] = 15; fill[2] = 1;
arr[3] = 20; fill[3] = 1;
如果这对您很重要,可以使用位集节省一些空间。
答案 1 :(得分:2)
int arr[32]={0};
int c=0;
arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;
for(int i=0; i<32; i++){
if(arr[i]){
c=c+1;
}
printf("count is %d",c);
}
答案 2 :(得分:0)
这就是我保留可能分配元素的严格列表的方法。这会创建一次写入数组。
int arr[32];
int assignedOrder[32];
int assignedOrderIndex = 0;
int assign (int index, value)
{
int i;
if (index < 0 || index >= 32)
return E_FAIL;
if (assignedOrderIndex == 32)
return E_FAIL;
for (i=0; i<assignedOrderIndex; i++)
if (assignedOrder[i] == index)
return E_FAIL;
arr[index] = value;
assignedOrder[assignedOrderIndex] = index;
assignedOrderIndex++;
return E_SUCCESS;
}
不知怎的,这可能是你应该转向C ++,因为有标准对象正好这个功能。