簡體   English   中英

實例的哈希圖與數組數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM