【问题标题】:How to get the number of used elements of an array of structures in C?如何获取C中结构数组的已使用元素数?
【发布时间】:2011-12-05 10:42:36
【问题描述】:

说我有:

struct a b[4];
//i filled some elements of b

我需要知道b 的非空元素的数量。 由于我不确定b 是否正好有 4 个非空元素,有没有办法做到这一点?

【问题讨论】:

  • 我的意思是,抱歉,没有填充第 i 个元素
  • "non-populated" 也没有任何意义。创建b 时,会创建四个struct a 元素。您需要结构本身中的某些内容来了解​​它们是否“正在使用”/“已填充” - 这取决于代码的语义(并且您需要以某种方式初始化它们)
  • 是的。数组已初始化,但并非全部都已填充。

标签: c arrays structure


【解决方案1】:

无法检索此信息。您必须跟踪自己使用的元素数量。

通常,C 开发人员在数组旁边使用另一个整数值:

struct a b[4];
int      b_count;

每次填充数组中的元素时递增计数器。

您可以将所有这些包装到一个结构中,以便将计数器保持在数组附近。这允许您从函数中返回数组以及计数器:

struct array {
    struct a values[4];
    int      count;
};
struct array b;

【讨论】:

    【解决方案2】:

    有两种正常的方法可以做到这一点。

    第一个是有某种标记值,表明数组元素没有被使用。例如,如果您以整数形式存储数量,则可以使用值 -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].
    

    【讨论】:

      【解决方案3】:

      C 中没有这种 emptynon-empty 的区别。 您描述为 empty 的东西可能指的是未初始化的变量。

      【讨论】:

        【解决方案4】:

        您必须跟踪填充数组时使用了多少元素。请注意,你必须(==必须)这样做,因为在 c 中,没有数组的边界检查,所以你必须跟踪你没有超出数组的边界(你如果您不这样做,最终会出现未定义的行为),同时您可以轻松跟踪您使用了多少元素。

        【讨论】:

          【解决方案5】:

          C 不会在它的数组中产生任何开销,因此它不会存储任何其他信息,包括元素计数。有一个不错的 c++ std::vector 模板,以防你不想自己做(这可能很烦人),如果你愿意使用 c++,只是说:)

          【讨论】:

            【解决方案6】:

            您可以做的一件事是在您插入的最后一项之后标记下一项。例如,您使用了 2 个元素,那么您可以使用特定数据标记第三个元素,例如 -1

            另一种方法是您可以保留一个变量,该变量具有结构中元素的计数。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-01-07
              • 1970-01-01
              • 1970-01-01
              • 2016-08-13
              • 1970-01-01
              • 2018-05-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多