g_hash_table_new_full
时间: 2023-10-03 16:10:28 浏览: 169
`g_hash_table_new_full` 是 GLib 中的一个函数,用于创建一个新的哈希表。它与 `g_hash_table_new` 类似,但是可以指定两个回调函数来释放哈希表中的 key 和 value。
函数原型如下:
```c
GHashTable* g_hash_table_new_full(GHashFunc hash_func,
GEqualFunc key_equal_func,
GDestroyNotify key_destroy_func,
GDestroyNotify value_destroy_func);
```
参数说明:
- `hash_func`:哈希函数,用于计算 key 的哈希值。
- `key_equal_func`:key 比较函数,用于判断两个 key 是否相等。
- `key_destroy_func`:key 销毁函数,用于释放哈希表中的 key。
- `value_destroy_func`:value 销毁函数,用于释放哈希表中的 value。
函数返回一个 `GHashTable` 类型的指针,表示创建的哈希表。如果创建失败,则返回 NULL。使用完毕后,需要调用 `g_hash_table_destroy` 函数销毁哈希表。
示例:
```c
// 定义 key 和 value 的结构体
typedef struct {
char* key;
int value;
} HashData;
// 定义 key 的哈希函数
guint key_hash(gconstpointer key) {
return g_str_hash((gchar*)key);
}
// 定义 key 的比较函数
gboolean key_equal(gconstpointer a, gconstpointer b) {
return g_strcmp0((gchar*)a, (gchar*)b) == 0;
}
// 定义 key 的销毁函数
void key_destroy(gpointer data) {
g_free(data);
}
// 定义 value 的销毁函数
void value_destroy(gpointer data) {
g_slice_free(HashData, data);
}
int main() {
GHashTable* hash_table = g_hash_table_new_full(key_hash, key_equal, key_destroy, value_destroy);
// 向哈希表中插入数据
HashData* data1 = g_slice_new(HashData);
data1->key = g_strdup("key1");
data1->value = 1;
g_hash_table_insert(hash_table, data1->key, data1);
HashData* data2 = g_slice_new(HashData);
data2->key = g_strdup("key2");
data2->value = 2;
g_hash_table_insert(hash_table, data2->key, data2);
// 从哈希表中查找数据
HashData* data3 = g_hash_table_lookup(hash_table, "key1");
if (data3 != NULL) {
printf("value: %d\n", data3->value);
}
// 销毁哈希表
g_hash_table_destroy(hash_table);
}
```
在上述示例中,我们定义了一个结构体 `HashData`,其中包含 key 和 value 两个字段。我们使用 `g_hash_table_new_full` 函数创建了一个哈希表,指定了 key 的哈希函数、比较函数和销毁函数,以及 value 的销毁函数。然后向哈希表中插入了两条数据,通过 `g_hash_table_lookup` 函数查找了一条数据,并在最后调用了 `g_hash_table_destroy` 函数销毁了哈希表。
阅读全文