我在C中创建一个HashMap,我正在尝试创建一个在所有HashMaps中都是标准的Values()函数。
假设我的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
和数组
答案 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.