说我有:
struct a b[4];
//i filled some elements of b
我需要知道b
的非空元素的数量。
由于我不确定b
是否恰好有4个非空元素,有没有办法做到这一点?
答案 0 :(得分:3)
无法检索此信息。你必须自己跟踪你使用的元素数量。
通常,C开发人员在数组旁边使用另一个整数值:
struct a b[4];
int b_count;
每次填充数组中的元素时,递增计数器。
你可以将所有这些包装成一个结构,以便将计数器保持在数组附近。这允许您从函数返回数组和计数器:
struct array {
struct a values[4];
int count;
};
struct array b;
答案 1 :(得分:2)
有两种常规方法可以做到这一点。
第一个是使用某种sentinel值,表示数组元素未被使用。例如,如果您以整数存储数量,则可以使用值-1
表示它未被使用。
作为您的情况的一个更相关的例子:
struct a {
int inUse;
// all other fields in structure
};
并将数组元素中的inUse
设置为1或0,具体取决于该数组元素是否正在使用中。
第二种方法是在数组外维护额外的信息,以指示哪些元素正在使用中。如果使用信息稀疏,则可以是映射,如果可以保证活动元素在开始时是连续的,则可以是计数。
对于地图,您可以使用:
struct a b[4];
int inUse[4]; // shows inUse indication for each element.
对于更简单的计数变化:
struct a b[4];
int inUseAtStart; // 0 thru 4 shows how many elements are in use,
// starting at b[0].
答案 2 :(得分:1)
C中没有空或非空区别。 您描述为空的内容可能是指未初始化的变量。
答案 3 :(得分:1)
您必须跟踪填充时使用的数组元素数量。请注意你必须(==必须)这样做,因为在c中,没有数组的绑定检查,所以你必须跟踪你没有超过数组的边界(你如果您不这样做,最终会得到一个未定义的行为,同时您可以轻松跟踪您使用的元素数量。
答案 4 :(得分:0)
C不会在其数组中产生任何开销,因此它不会存储包括元素计数在内的任何其他信息。有一个像样的c ++ std :: vector模板,如果你不想自己做(这可能很烦人),如果你愿意使用c ++,只需说:)
答案 5 :(得分:0)
您可以做的一件事是在插入的最后一个项目之后标记下一个项目。例如,您使用了2个元素,然后您可以使用特定数据(如-1
)标记第三个元素。
另一种方法是你可以做的是保持一个变量,它具有结构中元素的数量。