Klib之khash學習筆記

2021-10-02 09:53:58 字數 2929 閱讀 7388

klib提供的khash.h的初始化方法分為兩種資料結構,分別是set和map。set只有鍵,且鍵唯一,map有鍵和值,鍵唯一,而值不唯一。

set和map分別有三種初始化方法,對應鍵的型別分別為int,int64str,而雜湊演算法也分為數值和字串兩類

//set

#define khash_set_init_int(name) \

khash_init(name, khint32_t, char, 0, kh_int_hash_func, kh_int_hash_equal)

#define khash_set_init_int64(name) \

khash_init(name, khint64_t, char, 0, kh_int64_hash_func, kh_int64_hash_equal)

#define khash_set_init_str(name) \

khash_init(name, kh_cstr_t, char, 0, kh_str_hash_func, kh_str_hash_equal)

//map

#define khash_map_init_int(name, khval_t) \

khash_init(name, khint32_t, khval_t, 1, kh_int_hash_func, kh_int_hash_equal)

#define khash_map_init_int64(name, khval_t) \

khash_init(name, khint64_t, khval_t, 1, kh_int64_hash_func, kh_int64_hash_equal)

#define khash_map_init_str(name, khval_t) \

khash_init(name, kh_cstr_t, khval_t, 1, kh_str_hash_func, kh_str_hash_equal)

鍵值對中的kint32_tkhin64_t和系統有關,用於定義乙個很大的取值範圍。

#if uint_max == 0xffffffffu

typedef unsigned int khint32_t;

#elif ulong_max == 0xffffffffu

typedef unsigned long khint32_t;

#endif

#if ulong_max == ullong_max

typedef unsigned long khint64_t;

#else

typedef unsigned long long khint64_t;

#endif

kh_cstr_t的定義是typedef const char *kh_cstr_t;, 是乙個不會變的字串。

這兩種型別用於設定khash_init的引數khkey_tkhval_t, 用於初始化雜湊表的結構定義

#define __khash_type(name, khkey_t, khval_t) \

typedef struct kh_##name##_s kh_##name##_t;

和雜湊表操作有關的函式如下

為了達到類似於python的字典操作,例如d =d["abc"],所需要寫的**如下

#include #include #include "klib/khash.h"

khash_map_init_str(dict, char*)

int main(int argc, char *ar**)

}kh_destroy(dict, h);

}

對於字串,雜湊表結構中的keysvals並不存放實際的值,而是存放字串的位址,因此如果沒有專門記憶體用於存放鍵值對對字串,那麼用strdup在記憶體中獲取字串新的位址。 如果用乙個字串陣列存放鍵值對字串的位址,**如下:

#include #include #include "klib/khash.h"

khash_map_init_str(dict, char*)

int main(int argc, char *ar**)

; char *value = ;

// h =

k = kh_put(dict, h, "abc", &ret);

kh_key(h, k) = key[0];

kh_value(h,k) = value[0];

// h["efg"] = "bbb"

k = kh_put(dict, h, "efg", &ret);

kh_key(h, k) = key[1];

kh_value(h,k) = value[1];

// h["abc"]

k = kh_get(dict, h, "abc");

printf("%s\n", kh_value(h,k));

kh_destroy(dict, h);

}

推薦閱讀

學習筆記之 指標

本文是學習linux c程式設計一站式學習的學習筆記 一,指標與陣列 對於 1 指標之間是可以相互比較,同時指標之間也可以做減法運算,不過是有條件的。指標之間比較的是位址,只有只想同乙個陣列中元素的指標之間相互比較才有意思。指標之間相減表示兩個指標之間相差的元素個數,同樣只有指向同乙個陣列元素的指標...

perl學習筆記之

1 表示式修飾符if unless while untile foreach 2 data檔案控制代碼 data 標誌著指令碼的邏輯結束,並開啟data檔案控制代碼用於讀取。3 m運算子 如果包圍正規表示式的定界符是斜槓,m運算子是可選的 如果忙亂變了定界符,則是要求的。格式 regular exp...

學習筆記之其它

1.清空cookie cookie.expires datetime response.cookies username expires 0 2.panel 橫向滾動,縱向自動擴充套件 3.回車轉換成tab nkeyd wn if event.keycode 13 event.keycode 9 示...