klib提供的khash.h的初始化方法分為兩種資料結構,分別是set和map。set只有鍵,且鍵唯一,map有鍵和值,鍵唯一,而值不唯一。
set和map分別有三種初始化方法,對應鍵的型別分別為int
,int64
和str
,而雜湊演算法也分為數值和字串兩類
//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_t
和khin64_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_t
和khval_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);
}
對於字串,雜湊表結構中的keys
和vals
並不存放實際的值,而是存放字串的位址,因此如果沒有專門記憶體用於存放鍵值對對字串,那麼用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 示...