百度云glib  链接:https://pan.baidu.com/s/1W9qdlMKWRKIFykenTVuWNQ 密码:ol6y

hash表是一种提供key-value访问的数据结构,通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典,通过单词的首字母能够快速的找到单词。关于hash表的详细介绍请查阅数据结构的相关书籍,我这里只介绍glib库中hash表的基本用法。

要使用一个hash表首先必须创建它,glib库里有两个函数可以用于创建hash表,分别是g_hash_table_new()和g_hash_table_new_full(),它们的原型如下:

 GHashTable *g_hash_table_new(GHashFunc hash_func, GEqualFunc key_equal_func);

 GHashTable* g_hash_table_new_full(GHashFunc hash_func,
GEqualFunc key_equal_func,
GDestroyNotify key_destroy_func,
GDestroyNotify value_destroy_func);

其中hash_func是一个函数,它为key创建一个hash值;key_equal_func用于比较两个key是否相等;
key_destroy_func当你从hash表里删除、销毁一个条目时,glib库会自动调用它释放key所占用的内存空间,
这对于key是动态分配内存的hash表来说非常有用;value_destroy_func的作用与key_destroy_func相似,
只是它释放的是value占用的内存空间。

下面以一段代码来演示glib库中hash表的基本用法

 /***************************************************************************
file: g_hash.c
desc: 这个文件用于演示glib库中hash表的用法
compile: gcc -o g_hash g_hash.c `pkg-config --cflags --libs glib-2.0`
***************************************************************************/ #include <glib.h> void print_key_value(gpointer key, gpointer value, gpointer user_data);
void display_hash_table(GHashTable *table);
void free_key(gpointer data);
void free_value(gpointer value); void print_key_value(gpointer key, gpointer value, gpointer user_data)
{
printf("%s ---> %s/n", key, value);
} void display_hash_table(GHashTable *table)
{
g_hash_table_foreach(table, print_key_value, NULL);
} void free_key(gpointer data)
{
printf("We free key: %s /n", data);
free(data);
} void free_value(gpointer data)
{
printf("We free value: %s /n", data);
free(data);
} int main(int argc, char *argv[])
{
GHashTable *table = NULL; table = g_hash_table_new(g_str_hash, g_str_equal); g_hash_table_insert(table, "", "one");
g_hash_table_insert(table, "", "two");
g_hash_table_insert(table, "", "three");
g_hash_table_insert(table, "", "four");
g_hash_table_insert(table, "", "five");
display_hash_table(table);
printf("Size of hash table: %d /n", g_hash_table_size(table)); printf("Before replace: 3 ---> %s /n", g_hash_table_lookup(table, ""));
g_hash_table_replace(table, "", "third");
printf("After replace: 3 ---> %s /n", g_hash_table_lookup(table, "")); g_hash_table_remove(table, "");
display_hash_table(table);
printf("Now size of hash table: %d /n", g_hash_table_size(table)); g_hash_table_destroy(table); table = g_hash_table_new_full(g_str_hash, g_str_equal, free_key, free_value);
g_hash_table_insert(table, strdup("one"), strdup("first"));
g_hash_table_insert(table, strdup("two"), strdup("second"));
g_hash_table_insert(table, strdup("three"), strdup("third")); printf("Remove an item from hash table: /n");
g_hash_table_remove(table, "two"); printf("Destroy hash table: /n");
g_hash_table_destroy(table); return ;
}

通过代码我们看到glib库为hash表接供了非常简单的接口。下面是代码的输出

[plusboy@localhost c]$ ./g_hash
1 ---> one
2 ---> two
3 ---> three
4 ---> four
5 ---> five
Size of hash table: 5
Before replace: 3 ---> three
After replace: 3 ---> third
1 ---> one
3 ---> third
4 ---> four
5 ---> five
Now size of hash table: 4
Remove an item from hash table:
We free key: two
We free value: second
Destroy hash table:
We free key: three
We free value: third
We free key: one
We free value: first

对代码的说明:

1、首先我们调用了g_hash_table_new()来创建一个hash表,然后用g_hash_table_insert()向hash表里插入条目,插入的条目必须是一个key-value对,要查看hash表里有多少个条目可以用g_hash_table_size()。
2、用g_hash_table_lookup()通过key可以查找到与它相对应的value,g_hash_table_replace()可以替换掉一个key对应的value。
3、用g_hash_table_foreach()可以遍历hash表里的每一个条目,并对它们进行相应的操作。
4、用g_hash_table_remove()把一个条目从hash表里删除。
5、用g_hash_table_destroy()销毁一个hash表。
6、对于用g_hash_table_new_full()创建并提供了key_destroy_func和value_destroy_func的hash表,删除hash表中的条目或者销毁hash表的时候,库自动调用这两个函数释放内存,在销毁hash表的时候,销毁条目的顺序与插入条目的顺序并不总是相同的。代码中我们用strdup()来为hash表的key和value动态分配内

Linux-c glib库hash表GHashTable介绍的更多相关文章

  1. glib 库 hash table 使用

    glib库提供了 hashtable 的实现 1. 常用函数: 创建一个 GHashTable 函数: hash_func 是创建value的key值的函数,key_equal_func 是比较两个k ...

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

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

  3. Hash表算法

    出处:http://blog.csdn.net/v_JULY_v 第一部分:Top K 算法详解问题描述百度面试题:    搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的 ...

  4. Linux 上的常用文件传输方式介绍与比较

    ftp ftp 命令使用文件传输协议(File Transfer Protocol, FTP)在本地主机和远程主机之间或者在两个远程主机之间进行文件传输. FTP 协议允许数据在不同文件系统的主机之间 ...

  5. 十一、从头到尾彻底解析Hash 表算法

    在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  ...

  6. 从头到尾彻底解析Hash表算法

    作者:July.wuliming.pkuoliver 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部分为打造一个最快的Hash ...

  7. 从头到尾解析Hash表算法

    via:点击打开链接 十一.从头到尾解析Hash 表算法 作者:July.wuliming.pkuoliver   出处:http://blog.csdn.net/v_JULY_v.   说明:本文分 ...

  8. 从头到尾彻底解析Hash 表算法

    作者:July.wuliming.pkuoliver  出处:http://blog.csdn.net/v_JULY_v.  说明:本文分为三部分内容,    第一部分为一道百度面试题Top K算法的 ...

  9. Mysql --库和表的操作

    库的增删改查 系统数据库 创建数据库 数据库的相关操作 表的操作 存储引擎介绍(有点多 很啰唆) 表的介绍 表的操作 一.系统数据库 查看系统库: show databases; nformation ...

随机推荐

  1. Java学习 时间类 Period类与Duration类 / LocalDate类与Instant类 用法详解

    前言 java 8 中引入的两个与日期相关的新类:Period 和 Duration.两个类看表示时间量或两个日期之间的差,两者之间的差异为:Period基于日期值,而Duration基于时间值.他们 ...

  2. python中的 += 语法的使用

    python中有个缩略的写法,如下 a = a +1 等同于 a +=1 发现了一个有趣之处,+=的写法中间不能有空格,否则报错,测试如下 Python 3.7.1 (v3.7.1:260ec2c36 ...

  3. Odoo Javascript 参考

    本文介绍了odoo javascript框架.从代码行的角度来看,这个框架不是一个大的应用程序,但它是非常通用的,因为它基本上是一个将声明性接口描述转换为活动应用程序的机器,能够与数据库中的每个模型和 ...

  4. luoguP1062 数列 [数学]

    题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是 ...

  5. Kunbernetes从私有仓库nexus拉取镜像

    1.docker登陆认证 [root@master ~]# vim /etc/docker/daemon.json { "insecure-registries": [" ...

  6. Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄

    有了回调函数的概念及上面的例子,我们可以继续了.其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow.其函数原形是:function FindWindow(lpClass ...

  7. HTML <body>的常用属性

    bgColor : 网页背景色  如 <body bgColor="red"> Background : 网页背景图片的地址 如 <body background ...

  8. python编码(31-01)

    以什么方式编码,就以什么方式解码! 第一种编码与解码方式: encode()编码 decode()解码 type()查看数据类型 repr()查看数据内容 s = '你好'print(type(s)) ...

  9. 运算符的基本概念以及常用Scanner、随机数Random、选择结构的初步了解

    运算符 分类 算术运算符 位运算符 关系运算符|比较运算符 逻辑运算符 条件运算符 赋值运算符 其中优先级顺序从上到下,可以记忆口诀:单目乘除位关系,逻辑三目后赋值 操作数: 运算符左右两边的数 表达 ...

  10. 第四周课堂笔记3th

    1.函数的嵌套 作用域,说的是变量 全局作用域:内置命名空间,全局命名空间  全局空间不可以引用局部空间 局部作用域: 局部命名空间  开辟的临时空间前提是调用了函数 全局作用域在整个文件中被使用 L ...