glib库提供了 hashtable 的实现

1. 常用函数:

创建一个 GHashTable 函数:
hash_func 是创建value的key值的函数,key_equal_func 是比较两个key是否相等的函数
GHashTable* g_hash_table_new (GHashFunc hash_func, GEqualFunc key_equal_func)
插入一个 key 和 value 到 GHashTable 函数:
注意:这里的key和value必须是一个独立的存储空间
void g_hash_table_insert (GHashTable *hash_table, gpointer key, gpointer value)
根据给定的 key 查找 value 函数:
gpointer g_hash_table_lookup (GHashTable *hash_table, gconstpointer key)
gboolean g_hash_table_lookup_extended (GHashTable *hash_table, gconstpointer lookup_key, gpointer *orig_key, gpointer *value)
 
gpointer 可以看作是一个 void* 的类型
需要特别注意:g_hash_table_new ()
参数 hash_func 和 key_equal_func 需要自己实现。在使用的时候,根据 key 的类型不同,进行相应的实现。
如果插入的时候使用了 char* 类型的 key,但是如果g_hash_table_new 中的参数用的是int类型的比较实现,
那么在 g_hash_table_lookup 的时候就会找不到value;
在glib库中已经给了实现的函数下面举例说明

2.使用举例

下面是正确的使用方法
//string类型key的比较函数
gboolean g_str_equal (gconstpointer v1, gconstpointer v2)
{
const gchar *string1 = v1;
const gchar *string2 = v2; return strcmp (string1, string2) == 0;
} //string类型key生成函数
guint g_str_hash (gconstpointer v)
{
/* 31 bit hash function */
const signed char *p = v;
guint32 h = *p; if (h)
for (p += 1; *p != '\0'; p++)
h = (h << 5) - h + *p; return h;
} GHashTable *ghashtbal = g_hash_table_new (g_str_hash , g_str_equal);
char *key = "testkey";
char *value = "testvalue";
char *tmp = NULL; //插入的时候需要对内存
g_hash_table_insert (hash_table, strdup(key), strdup(value)); tmp = g_hash_table_lookup (hash_table, key);
 3.注意:
下面是错误的用法,原因是 key 为字符串,但是使用了 int 型的 key 的生成函数和比较函数
//int类型key的比较函数
bool g_int_equal (void *a, void *b)
{
bool flag = false;
flag = *((const gint*) a) == *((const gint*) b);
return flag;
} //int类型key生成函数
unsigned int g_int_hash (void *key)
{
unsigned int num = ;
num = (unsigned int) *((const unsigned int*) key);
return num;
} GHashTable *ghashtbal = g_hash_table_new (g_int_hash , g_int_equal);
char *key = "testkey";
char *value = "testvalue";
char *tmp = NULL; //插入的时候需要对内存
g_hash_table_insert (hash_table, strdup(key), strdup(value)); //这个地方 tmp 有可能就找不到了
tmp = g_hash_table_lookup (hash_table, key);
 

glib 库 hash table 使用的更多相关文章

  1. Linux-c glib库hash表GHashTable介绍

    百度云glib  链接:https://pan.baidu.com/s/1W9qdlMKWRKIFykenTVuWNQ 密码:ol6y hash表是一种提供key-value访问的数据结构,通过指定的 ...

  2. 几种常见 容器 比较和分析 hashmap, map, vector, list ...hash table

    list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的.  如果我自己写,我也会用二叉检索树,它在 ...

  3. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  4. 系列篇|编译可在Android上运行的依赖库(一):glib库

    前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库 ...

  5. 哈希表(Hash Table)

    参考: Hash table - Wiki Hash table_百度百科 从头到尾彻底解析Hash表算法 谈谈 Hash Table 我们身边的哈希,最常见的就是perl和python里面的字典了, ...

  6. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  7. PHP内核探索之变量(3)- hash table

    在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量 ...

  8. php Hash Table(四) Hash Table添加和更新元素

    HashTable添加和更新的函数: 有4个主要的函数用于插入和更新HashTable的数据: int zend_hash_add(HashTable *ht, char *arKey, uint n ...

  9. php Hash Table(一) Hash Table的结构

    关于Hash Table专题: 一直想深入理解一下php的hash table的实现,以前一直是星星点点的看看,从未彻底的总结过,那就从这个专题开始吧! 主要想总结几个部分:hashtable结构,h ...

随机推荐

  1. My97datepicker日期控件

    转自:http://www.my97.net/dp/demo/index.htm 非常不错的一篇文章,介绍的很详细.感兴趣的朋友可以好好研究一下. 网上资源很多的,可以下一个来使用. 先说一下整个文件 ...

  2. The template root requires exactly one element

    The template root requires exactly one element

  3. 前端几个笔试题及答案(bd)

    1.   行内元素.块级元素和空元素(void)举例. 块级元素:<address>.<caption>.<dd>.<div>.<dl>.& ...

  4. [容易]Fizz Buzz 问题

    题目来源:http://www.lintcode.com/zh-cn/problem/fizz-buzz/

  5. 【linux】如何查看进程运行在那颗cpu上

    这里介绍一种方法查看进程运行在哪个cpu上, 首先top 然后按字母:f 按字母:j 回车即可 其中P列表示进程运行在哪个CPU上

  6. mysql服务器启动问题

    The server quit without updating PID file (/usr/local/mysql/data/snsgou.pid);可能的情况是启动的用户不对,

  7. Java for LeetCode 128 Longest Consecutive Sequence

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  8. Cannot load JDBC driver class 'com.mysql.jdbc.Driver '

    最近在学JAVA, SSM, 照着网上的例子系统启动后总是报这个错(IDE :IEDA): HTTP Status 500 - Request processing failed; nested ex ...

  9. 2048聚合版开源代码,cocos2d-js编写,基于CocosEditor开发工具,可运行Android,ios,html5等

    1. [代码][JavaScript]代码         /** * @GameName : * 2048 * * @DevelopTool: * Cocos2d-x Editor (CocosEd ...

  10. mysql七:视图、触发器、事务、存储过程、函数

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...