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. MarkdownPad - The Markdown Editor for Windows http://markdownpad.com/

    MarkdownPad - The Markdown Editor for Windows http://markdownpad.com/

  2. mysql系列之1.mysql基础

    非关系型(NOSQL)数据库 键值存储数据库: memcached  /  redis  /  memcachedb  /  Berkeley db 列存储数据库: Cassandra  /  Hba ...

  3. 使用Retrofit发送POST请求提交JSON数据

    Retrofit官网:https://square.github.io/retrofit/ 示例如下 HttpService.java import okhttp3.RequestBody; impo ...

  4. 聚聚科技——php开发笔试题及答案

    聚聚科技是一个刚创立的公司,很小很小,人很少,老板感觉是个典型的北京小伙儿,戾气很重,很有个性.笔试题倒是简单: 1. echo(), print(), print_r()的区别? echo是PHP语 ...

  5. 查找SAP 系统Parameter ID 4种方法

    转自 http://blog.csdn.net/jy00873757/article/details/8517426 ***程序RPR_ABAP_SOURCE_SCAN  一.用F1,直接可以看到这个 ...

  6. fusioncharts 用法实例

    支持xml格式和json格式的数据. 用法很简单. 1.需要引入FusionCharts.js. 2.html中定义个id="chart"的div <div id=" ...

  7. ubuntu 更新软件命令

    安装软件最好加权限(sudo) --default-timeout=100 设置超时时间100秒 install -U setuptools 表示更新安装setuptools sudo pip3 -- ...

  8. STM32 Flash Download failed

    笔者使用Keil开发环境对STM32L Discovery进行开发,更新一次firmware后就不能连接目标板了,报错Internal command error Flash download fai ...

  9. entity framework WithRequiredDependent和WithRequiredPrincipal

    A->WithRequiredDependent->B 表示 A中包含B的不为null实例 ,A是主键实体  B是外键实体 A->WithRequiredPrincipal-> ...

  10. 使用C++模拟C#的委托机制

    1. [代码][C/C++]代码 //Event.h  #ifndef _EVENT_H_#define _EVENT_H_class EmptyObject {};template<typen ...