g_hash_table_replace 和 g_hash_table_insert 的区别
时间: 2023-06-09 16:01:57 浏览: 61
g_hash_table_replace和g_hash_table_insert都是在哈希表中插入或替换键值对的函数。g_hash_table_insert在哈希表中插入键值对,如果键已经存在,则不进行任何操作。而g_hash_table_replace在哈希表中替换键值对,如果键不存在,则先插入键值对,再替换值。所以,g_hash_table_replace相对于g_hash_table_insert实现了对已有键的值的更新。
相关问题
g_hash_table_new_full
`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` 函数销毁了哈希表。
HASH_REPLACE
HASH_REPLACE是一个宏定义,用于在Linux内核中进行哈希表操作。它用于替换哈希表中的一个元素,具体实现如下:
```c
#define HASH_REPLACE(hh, head, fieldname, keylen_in, key_in, add) \
do { \
unsigned _hr_hh_hashv; \
void *_hr_hh_hh; \
HASH_FIND(hh,head,key_in,keylen_in,_hr_hh_hh); \
if (_hr_hh_hh) { \
HASH_DELETE(hh,head,_hr_hh_hh); \
add = _hr_hh_hh; \
} else add = NULL; \
_hr_hh_hashv = hashlittle(key_in, keylen_in, 0); \
HASH_ADD(hh,head,fieldname,keylen_in,_hr_hh_hashv,add); \
} while (0)
```
这个宏定义使用了一系列的哈希表操作函数,包括HASH_FIND、HASH_DELETE和HASH_ADD。它首先通过HASH_FIND函数在哈希表中查找指定的元素,如果找到了,则使用HASH_DELETE函数将其从哈希表中删除。然后,通过HASH_ADD函数将新的元素添加到哈希表中。
这个宏定义的作用是实现了一种高效的哈希表元素替换操作,可以方便地更新哈希表中的元素。