首页 > 解决方案 > 如何处理哈希图中缺少的键

问题描述

key当要求 a 无法返回时,什么可能是正确的错误或返回代码?

void hash_delete(hash_table* table, const char* key)
{
    hash_item* item = hash_get(table, key);
    if (item == NULL)
        ; // what error to raise?
    else
        delete_hash_item_internal(item);
}

我的想法是要么让函数返回 a bool(1=找到,0=未找到),要么执行exit(). 您认为处理此问题的正确方法是什么?

标签: c

解决方案


您有多种可能性,因为您是设计该功能的人。然而,调用exit()不是一个好的选择,因为它总是强制函数的激进行为。最好让调用者有权决定停止程序、继续、记录某些内容等(正如已经在对 OP 的评论中指出的那样)。所以我会选择在键存在和不存在时返回不同的值。您可以在以下选项中进行选择:

  • 返回一个简单的bool. true找到(删除)键时返回。false找不到密钥时返回。最简单易懂的行为。
  • 返回一个char*NULL找到(删除)键时返回。key找不到时返回自身。这种方法允许直接对结果采取进一步的行动。这可能很有用,例如,如果密钥是从函数中获取的,并且除非该函数失败,否则不需要存储在变量中。
  • 返回一个hash_item*。找到键时返回item变量。NULL找不到密钥时返回。这是删除函数时最典型的行为之一,它允许直接使用delete函数的返回值作为get+delete避免单独调用。请注意,此方法可能存在一些问题,具体取决于hash_table实现方式。例如,如果它包含指向hash_item可能因此包含“有效”NULL值的指针,并且这些可以解释为删除函数没有找到条目而不是找到包含NULL. item如果delete_hash_item_internal()函数从存储在表中的指针(您将返回)或类似的东西中释放内存,返回也可能有问题。

如果必须选择,我更喜欢最后一个选项(如果可能由于我提到的问题)。如果不可能,为了简单起见,我会使用第一个。但最终由您作为设计师来决定哪个更好,同时还要考虑您需要的其余代码以及您希望如何使用该功能。


推荐阅读