c - 此实例的 hashmap 与数组数组

标签 c arrays hashmap

我正在使用 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/

相关文章:

HashMap 中的 Java Set<String>

将 Ruby 转换为 C 语言,有人愿意看一下吗?

c - 从单链表的末尾迭代到开头而不反转它

java - 在运行时从上传的文件覆盖 JCombox 值

java - 通过从扫描仪中读取行来实例化一个 ArrayList,在哪里声明对象?

java - Java HashMap 中的冲突解决

hashmap - 如何在 Rust 中懒惰地创建其构造使用 self 的映射条目

c - Doxygen 转义 C 中的嵌套注释

c - 液晶屏坏了

python - 对列进行分组,列是对象列表,但会导致错误: unhashable type: 'numpy.ndarray'