我使用的是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更麻烦吗?
答案 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