hashmap vs此实例的数组数组

时间:2016-01-25 11:48:52

标签: c arrays hashmap

我使用的是C编程语言,想问这个简单的问题。让我们说我有这样的数据结构:

typedef struct {
    char* tag;
    char* name;
    unsigned int id;
} object;

在其他语言中,您可以创建一个包含键和值对的哈希映射,然后将它们放在那里。 C没有内置的hashmap,但我想我可以使用一些第三方hashmap库,但这可能对我的用例来说太过分了。

基本上我想通过tag或id来某种方式访问​​其中一些;使用数组或指针以及此数组大小的变量,我几乎可以添加到列表中,按ID或标记排序,或者在没有第三方库的情况下完成我在C中要做的事情。< / p>

typedef struct {
    object** objects;
    unsigned int count;
} object_bag;

添加简单功能,无需重复检查等...

void add_object(object* obj) {
     int count = objects->count++;
     objects[count] = calloc(1,sizeof(object*));
     objects[count] = obj;
}

在这种情况下,是否有任何理由使用hashmap?这不是一个性能优化问题,我也很好奇,但是这个数据结构会比hashmap更麻烦吗?

1 个答案:

答案 0 :(得分:1)

我在您提供的代码中看到的直接问题是,您需要为整个 指针数组objects)[at]分配一些空间至少你遗漏了这部分代码]。

您似乎尝试一次为一个阵列单元分配空间,这不是数组的工作方式。 (数组需要是一个连续的内存,所以你需要预先分配整个数组)(参见下面的约翰提示)

如果你想支持任意大小的集合,请准备好重新分配一些空间,以防你存储的对象多于先前为指针分配的空间。

因为您似乎不需要&#34;随机访问&#34;对于数组的功能,您可以选择使用&#34;链接列表&#34;实现。它具有更容易增长的属性(只需分配一个新元素并将其链接到结尾)。

如果你在posix上开发,你可能想要使用&#34;内置&#34; sys/queue.h链接列表实现:http://man7.org/linux/man-pages/man3/queue.3.html

如果我是你,我很可能会重用一个现成的库,以便能够在第一手资料中使用最合适的数据结构。如果你进行应用程序开发,glib可能是一个不错的选择:https://developer.gnome.org/glib/stable/glib-Hash-Tables.html