C - HashMap Values()函数 - 我是否返回NULL值?

时间:2016-08-30 02:58:21

标签: c null hashmap

我在C中创建一个HashMap,我正在尝试创建一个在所有HashMaps中都是标准的Values()函数。

for example

假设我的HashMap如下所示:

(注意,密钥集的类型为<void*, void*>

// CAPACITY = 8, SIZE = 4
[0] <"Pancakes", 24>
[1] = NULL
[2] = <"Waffles", 7>
[3] = NULL
[4] = NULL
[5] = NULL
[6] = <"Eggs", 12>
[7] = <"Bacon", 99>

通常情况下,在这个分区中,我会创建一个size_t 5的数组,它看起来如下所示。

{ 24, 7, 12, 99, NULL } 

NULL必须在这里或者在我返回数组后,尝试通过数组的循环将无法知道何时停止。

如果我有以下内容怎么办?

// CAPACITY = 8, SIZE = 4
[0] <"Pancakes", 24>
[1] = NULL
[2] = <"Waffles", NULL>
[3] = NULL
[4] = NULL
[5] = NULL
[6] = <"Eggs", 12>
[7] = <"Bacon", 99>

突然,我的数组如下所示:

{ 24, NULL, 12, 99, NULL }

当我在返回后尝试将其打印出来时,会打印出以下内容:

24

我该如何处理这个问题?我应该忽略NULL值吗?如果是这样,我的HashMap的{​​{1}}可能为4,并且程序员期望size函数中的4值,但我只给了他一个大小的数组Values()。不,我真的不想制作3以便将多个变量传回,例如struct和数组

3 个答案:

答案 0 :(得分:0)

除了返回ActiveRecord之外,您还有多个选项可以将不同大小的数组返回给调用者:

  • 让调用者传递一个数组和一个最大大小,并返回struct - 此选项要求调用者分配数组,这可能是静态完成的。
  • 将指针传递给返回数组,并返回大小 - 这要求调用者释放从函数返回的数组。
  • 您可以返回size_t - 已终止的数组 - 此方法还要求调用者释放结果,但不需要返回大小。

在数据中返回NULL,并指示调用者跳过它们,这是一个非常令人困惑的选择,它不会给你任何回报:你仍然需要告诉调用者返回的数组有多大是,NULL - 终止选项已经结束。

答案 1 :(得分:0)

一种选择是使用永远不会成为值集的一部分的sentinel值。例如,代替NULL,声明一个虚拟变量(任何类型)并使用其地址作为sentinel值:

int dummy;
void *sentinel = &dummy;

示例值数组将是:

{ 24, NULL, 12, 99, sentinel }

sentinel值是HashMap实现导出的API的一部分,客户端代码将检查该值以确定值数组的结束。

答案 2 :(得分:0)

To solve this problem I'm just going to return <Key, Value> Nodes instead of just Keys or Values. In my program, I won't have to deal with NULL Nodes so I avoid the problem of NULL Keys and Values completely. If I had to go with one of the suggested methods, I would use Kaylum's suggestion.

Thank you all.