【问题标题】:Declaring, changing, and adding to an array of a list of structs in C在 C 中声明、更改和添加到结构列表的数组
【发布时间】:2014-07-05 22:35:55
【问题描述】:

我创建了一个结构,并且该结构上有一个指标。我正在生成一系列这些结构,我想根据这个指标将它们排序到一个数组中。基本上,如果度量为 0,我希望它在数组的 [0] 槽中的列表中,如果度量为 14,我希望它在数组的 [14] 槽中的列表中。度量的界限(数组的大小)是基于生成结构的相同变量的变量,因此我需要使用 malloc 动态声明数组。我一直在尝试如何获取我的结构列表的数组。我想不通。我已经用谷歌搜索了这个问题,但无法提出解决方案。

另外,一旦我有了数组,如何将另一个元素添加到特定数组单元的列表中?然后回过头来比较第 i 个单元格中列表的所有元素和第 (n-i) 个单元格的元素?

【问题讨论】:

  • 您的数组是否非常大且空单元格比例很高?
  • 数组的大小与 N 成正比,我不得不估计只有 N/log(N) 个单元格会有条目。
  • n 能有多大?我正在尝试评估数组是否因为空条目而浪费了太多空间。这就是使用哈希表可能有用的原因:保存数组空条目。我的感觉是你需要学习 C 中指针的使用并用它们构建列表。

标签: arrays list c


【解决方案1】:

您需要的是哈希表,有时也称为关联数组字典。这是一个看起来像数组但可以获取任何(可散列的)数据类型作为索引的数据结构;由于您的指标,您的结构是可散列的。动态哈希表,例如 python 的字典,会自行调整大小以适应其内容。

如果您想在每个单元格中保留多个元素,只需将每个单元格设为一个列表。在 python 或任何其他高级语言中,您只需使用列表数据类型。在低级语言上,您可以改用链表。

【讨论】:

  • 我实际上首先在 python 中编写了这个代码并使用了列表。你能给我一个哈希表的例子,每个单元格都是一个列表。然后如何访问这些列表?我以前从未使用过哈希表,并且从示例中学习得更快。
【解决方案2】:

根据您的问题以及您对@Yuval 的评论,您似乎可以使用Python 对此进行调查,如果我理解正确,您可能有多个struct 具有相同的metric 值,您现在想将它们组合成一个列表(如果其中有任何错误,请纠正我,我会根据需要尝试进行编辑)。

@Yuval 提出了一个很好的观点——这似乎是关于使用哈希表/字典,一旦你习惯了它们就会非常有帮助。基本上,它们不是简单地通过某个索引访问元素,范围从 0 到 N-1 或类似的,它们为您提供了一种将键与值或值列表相关联的方法。

这是一些 Python 代码,假设您已经创建了 structs,并且它们具有 metric 属性:

## build the hahtable
metricDict = dict() ## or: metricDict = {}
for struct in structs:
    key = struct.metric
    metricDict[key] = struct

## access your items:
for metric, struct in metricDict.items():
    ## ... whatever you want to do

这里有几个关键点:

1) 这些结果可能看起来像是“随机”从您的字典中出来的——指标不会连续排序。这与哈希表如何实际工作的一些内部细节有关,现在深入解释可能有点过头了,但要记住的要点是字典是未排序的。为了解决这个问题,当您访问元素时:

for metric, struct in sorted(metricDict.items()):
    ## whatever you want to do

2) 这(默默地)忽略了多个structs 具有相同metric 值的问题 - 它只保留最后一个structmetric,覆盖以前的那些。也有一些简单的方法可以解决这个问题 - 您可以存储一个值列表,而不是存储单个值(或者,我可能会说:您存储的值是一个结构列表)

metricDict = dict()
for struct in structs:
    key = struct.metric
    if key in metricDict:
        metricDict[key].append(struct) ## add the struct to the list
    else:  ## first time we've seen key
        metricDict[key] = list() ## or metricDict[key] = []
        metricDict[key].append(struct)

我试图让它比必要的更明确一点。这种将事物聚合和组合在一起的想法非常普遍,以至于 Python 甚至有一个模块可以让事情变得更简单:

import collections
metricDict = collections.defaultdict(list)
for struct in structs:
    key = struct.metric
    metricDict[key].append(struct)

metricDict 足够聪明,知道如果它还没有看到密钥,而不是抛出错误,它只是创建一个默认值 - 在这种情况下是一个空列表 - 然后添加你的 struct到那个列表。

现在访问您的结构列表:

for metric, structs in sorted(metricDict.items()):
    ## print(metric)
    for struct in structs:
        ## whatever you wanted to do
        ## print(struct)

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2018-05-20
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多