[英]hashmap vs array of arrays for this instance
我正在使用C編程語言,並想問這個快速問題。 假設我有這樣的數據結構:
typedef struct {
char* tag;
char* name;
unsigned int id;
} object;
在其他語言中,您可以創建一個包含鍵和值對的哈希表,然后將它們扔在那里。 C沒有內置的哈希表,但是我認為我可以使用一些第三方哈希表庫,但是對於我的用例來說,這可能會顯得過高。
基本上,我希望有某種方式可以通過標記或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;
}
在這種情況下,會有任何理由使用哈希圖嗎? 這不是性能優化問題,我也很好奇,但是在某種程度上,這種數據結構會比哈希圖更麻煩嗎?
我使用提供的代碼遇到的直接問題是,您需要為整個 指針 ( objects
) 數組分配一些空間[至少您省略了這部分代碼]。
似乎您嘗試一次為單個數組單元分配空間,這不是數組的工作方式。 (數組需要是一個連續的內存塊,因此您需要預先分配整個數組)(請參見下面的Johan提示)
如果要支持任意大小的集合,請准備重新分配一些空間,以防存儲的對象比以前為指針分配的空間更多。
由於您似乎不需要對陣列的“隨機訪問”功能,因此您可以選擇使用“鏈接列表”實現。 它具有易於增長的屬性(只需分配一個新元素並將其鏈接到末尾)。
如果您在posix上進行開發,則可能要使用“內置” sys/queue.h
鏈表實現: http : sys/queue.h
如果您是我,我很可能會重用一個隨時可用的庫,以便能夠在第一手中使用最合適的數據結構。 如果您進行應用程序開發,則glib可能是一個不錯的選擇: https : //developer.gnome.org/glib/stable/glib-Hash-Tables.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.