我正在使用 C 编程语言,想问这个简短的问题。假设我有这样的数据结构:
typedef struct {
char* tag;
char* name;
unsigned int id;
} object;
在其他语言中,您可以创建一个包含键和值对的 HashMap ,然后将它们放入其中。 C 没有内置 HashMap ,但我在想我可以使用一些第三方 HashMap 库,但这对我的用例来说可能有点过分了。
基本上,我希望有一些方法可以通过标签或 ID 访问其中的一些;使用一个数组或指针以及一个表示该数组大小的变量,我几乎可以添加到列表中,按 id 或标签排序,或者在没有第三方库的情况下做我想在 C 中做的很多事情。
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 更麻烦?
最佳答案
我在您提供的代码中看到的直接问题是,您需要为您的整个指针数组分配一些空间(对象
) [至少你遗漏了这部分代码]。
您似乎试图一次一个地为单个数组单元格分配空间,这不是数组的工作方式。 (数组需要是一 block 连续的内存,所以你需要预先分配整个数组)(参见下面 Johan 的提示)
如果您想支持任意大小的集合,请准备好重新分配一些空间,以防您存储的对象多于之前为指针分配的空间。
由于您似乎不需要对数组进行“随机访问”功能,因此您可能会选择使用“链表”实现。它具有更容易增长的特性(只需分配一个新元素并将其链接到末尾)。
如果您在 posix 上开发,您可能希望使用“内置”sys/queue.h
链表实现:http://man7.org/linux/man-pages/man3/queue.3.html
如果我是你,我很可能会重用一个现成的库,以便能够直接使用最合适的数据结构。如果您进行应用程序开发,glib 可能是一个不错的选择:https://developer.gnome.org/glib/stable/glib-Hash-Tables.html
关于c - 此实例的 hashmap 与数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34991870/