glib hash库GHashTable的使用实例
前言
hash表是一种key-value访问的数据结构,hash表存储的数据能够很快捷和方便的去查询。在很多工程项目都需要使用到hash表来存储数据。对于hash表的详细说明这里就不进行阐述了,不了解的可以去查找资料进行了解。今天这里是使用glib的hash库来进行数据的存储和读写,通过实例来进行简单的应用。
gib GHashTable API介绍
这里会简单的说明一下例子中用到的api接口。
GHashTable *g_hash_table_new(GHashFunc hash_func, GEqualFunc key_equal_func);
功能:生成hash表。
参数:hash_func 创建hash值得函数,它为key创建一个hash值。这里可以用glib函数库里自带的g_str_hash。也可以用自己的创建的函数来建立规则
key_equal_func 用来比较key的函数,当入库时会进行key的比较。同样这里也可以 用glib自带的g_int_equal。也可以用自己的创建的函数来建立比较规则。
返回值:返回一个句柄。
GHashTable* g_hash_table_new_full(GHashFunc hash_func,GEqualFunc key_equal_func, GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func);
功能:同样是用来创建hash表的。比g_hash_table_new多了两个数据处理函数,相当于g_hash_table_new进阶版。因为在实际项目中很多都是需要进行内存管理。所以我们的例子用到的是这个函数。会用这个就会用上面那个了
参数:hash_func 创建hash值得函数,它为key创建一个hash值。这里可以用glib函数库里自带的g_str_hash。也可以用自己的创建的函数来建立规则
key_equal_func 用来比较key的函数,这个函数在哈希表查找键值时使用。同样这里也可以 用glib自带的g_int_equal。也可以用自己的创建的函数来建立比较规则。
key_destroy_func key数据处理函数,用来释放内存 。
value_destroy_func value数据处理函数,用来释放内存
返回值:返回一个句柄
void g_hash_table_insert(GHashTable *hash_table, gpointer key, gpointer value);
功能:向hash表中插入数据。
参数:hash_table:hash表的句柄,1 ,2函数的返回值
key:hash表键
value:hash表的值
void g_hash_table_foreach(GHashTable *hash_table, GHFunc func, gpointer user_data);
功能:hash表遍历函数,用来遍历hash表
参数:hash_table:hash表的句柄,1 ,2函数的返回值
func 回调函数,没遍历到一个key-value就回调此函数,对数据进行处理。
user_data:给回调函数传入的参数。
void g_hash_table_destroy(GHashTable *hash_table);
功能:释放hash表
参数:hash_table:hash表的句柄,1 ,2函数的返回值
在本文的实例中会用到上面的那些api接口。当然glib的hash函数接口肯定是不止上面那些的,这里只是一些简单的使用,下面是一些没用到的函数接口介绍,以后有时间在慢慢补到实例中去,其实不写看介绍一般也会用了。
guint g_hash_table_size(GHashTable *hash_table);
功能:返回表中键值对的个数
参数:hash_table:hash表的句柄,1 ,2函数的返回值
gpointer g_hash_table_lookup(GHashTable *hash_table, gconstpointer key);
功能:通过key去查找相对应的值。这个函数不会去判断这个key值是否存在的,在使用前要确保key不为NULL。
参数:hash_table:hash表的句柄,1 ,2函数的返回值
key:要查找的key。
gboolean g_hash_table_remove(GHashTable *hash_table, gconstpointer key);
功能:删除指定key的键值对。注意这个函数不会释放键值对的内存。所以如果使用 g_hash_table_new_full函数就比较方便了,会在删除的时候去回调函数释放。如果使用的是g_hash_table_new。就需要我们自己去释放内存了。这里需要注意
参数:hash_table:hash表的句柄,1 ,2函数的返回值
key:要删除的指定key
gpointer g_hash_table_find(GHashTable *hash_table, GHRFunc predicate, gpointer user_data);
功能:查找特定的键值对。会遍历hash表回调predicate函数判断自己定义规则的键值对。ture表示找到。
参数:hash_table:hash表的句柄,1 ,2函数的返回值
predicate 回调函数,用来定义特定键值对的规则。
user_data 传入回调函数的参数
void g_hash_table_replace(GHashTable *hash_table, gpointer key, gpointer value);
功能:向hash表中插入键值对。与g_hash_table_insert不同的是,如果插入的key已经存在这个会替换原来的key与value。g_hash_table_insert只会替换值
参数:hash_table:hash表的句柄,1 ,2函数的返回值
key:插入的键
value:插入的值
GList* g_hash_table_get_keys(GHashTable *hash_table);
功能:获取hash表中所有的键
参数:hash_table:hash表的句柄,1 ,2函数的返回值
GList* g_hash_table_get_values(GHashTable *hash_table);
功能:获取hash表中所有的值
参数:hash_table:hash表的句柄,1 ,2函数的返回值
还有一些函数这里就不做介绍了,具体可以到这里查看https://developer.gnome.org/glib/unstable/glib-Hash-Tables.html#
代码实例
编译 gcc main.c `pkg-config --libs --cflags glib-2.0` 后面有时间会增加api的实例数量。
#include <stdio.h>
#include <glib.h>
#include <stdlib.h>
#include <string.h> typedef struct _Node {
char key[];
char value[];
}Node; static void displayhash(gpointer key, gpointer value, gpointer user_data) {
printf("user_data:%s\n",user_data);
printf("key:%s value:%s\n",key,value);
} static void destroy_key(gpointer hash_data) {
printf("destroy key:%s\n",hash_data);
//因为我这里的键是数组形式不是指针所以不用释放内存。我就直接清空吧
/* free(hash_data);
hash_data = NULL;*/
memset(hash_data,,sizeof(hash_data));
} static void destroy_value(gpointer hash_data) {
printf("destroy value:%s\n",hash_data);
//因为我这里的值是数组形式不是指针所以不用释放内存。我就直接清空吧
/* free(hash_data);
hash_data = NULL;*/
memset(hash_data,,sizeof(hash_data));
} /*用来创建每个节点。每个键值对都需要有自己的内存*/
Node *create_node(char *key,char * value) {
Node *node = NULL;
node = malloc(sizeof(Node));
if (node == NULL) {
return NULL;
} memset(node,,sizeof(Node));
strcpy(node->key,key);
strcpy(node->value,value); return node;
} int main()
{
char buff[] = {};
static GHashTable *g_hash = NULL; g_hash = g_hash_table_new_full(g_str_hash, g_int_equal, destroy_key, destroy_value); Node *node = create_node("name","xcy");
if(node != NULL)
g_hash_table_insert(g_hash, &node->key, &node->value);
Node *node1 = create_node("age","");
if(node1 != NULL)
g_hash_table_insert(g_hash, &node1->key, &node1->value);
Node *node2 = create_node("sex","man");
if(node2 != NULL)
g_hash_table_insert(g_hash, &node2->key, &node2->value);
Node *node3 = create_node("id","");
if(node3 != NULL)
g_hash_table_insert(g_hash, &node3->key, &node3->value); memcpy(buff,"this is parm",);
if(NULL != g_hash) {
g_hash_table_foreach(g_hash, displayhash, buff);
} printf("------------------free hashtable------------------------\n"); g_hash_table_destroy(g_hash);
}
实例结果
glib hash库GHashTable的使用实例的更多相关文章
- Linux-c glib库hash表GHashTable介绍
百度云glib 链接:https://pan.baidu.com/s/1W9qdlMKWRKIFykenTVuWNQ 密码:ol6y hash表是一种提供key-value访问的数据结构,通过指定的 ...
- linux静态与动态库创建及使用实例
一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...
- 18、标准IO库详解及实例
标准IO库是由Dennis Ritchie于1975年左右编写的,它是Mike Lestbain写的可移植IO库的主要修改版本,2010年以后, 标准IO库几乎没有进行什么修改.标准IO库处理了很多细 ...
- live555库中的testH264VideoStreamer实例
1.h264文件的推送 testH264VideoStreamer.cpp文件的开头就定义了 char const* inputFileName = "test.264"; 后面接 ...
- live555库中的testRTSPClient实例
1.testRTSPClient简介 testRTSPClient是个简单的客户端实例,这个实例对rtsp数据交互作了详细的描述,其中涉及到rtsp会话的两个概念Source和Sink. Source ...
- 友善RK3399/NanoPC-T4开发板wiringPi Python库访问GPIO外设实例讲解 -【申嵌视频】
1 wiringPi for Python简介 wiringPi for Python是wiringPi的Python语言扩展,用于在Python程序中操作GPIO/I2C/SPI库/UART/PWM ...
- 编写自己的代码库(javascript常用实例的实现与封装)[转]
1.前言 因为公司最近项目比较忙,没那么多空余的事件写文章了,所以这篇文章晚了几天发布.但是这也没什么关系,不过该来的,总是会来的.好了,其他的不多说的,大家在开发的时候应该知道,有很多常见的实例操作 ...
- RTSP客户端接收存储数据(live555库中的testRTSPClient实例)
1.testRTSPClient简介 testRTSPClient是个简单的客户端实例,这个实例对rtsp数据交互作了详细的描述,其中涉及到rtsp会话的两个概念Source和Sink. Source ...
- live555库中的openRTSP实例
一.openRTSP编译运行 a)windows下编译运行 还是以mediaServer作为服务端,openRTSP作为客户端 b)Linux下编译运行 转自http://kuafu80.blog.1 ...
随机推荐
- C# null和" "的区别
String str1 = null; str引用为空 String str2 = ""; str引用一个空串 也就是null没有分配空间,""分 ...
- gatsbyjs 使用
1. 安装 npm install --global gatsby-cli 2. 使用 // 创建项目 gatsby new dalong cd dalong // 启动 gatsby develop ...
- Java知识点汇总
Java中泛型的本质 Java中静态变量的适用场景 Java类加载原理及类加载器 Java中对Clone的理解 Java中HashMap的实现 Java中Collection和Collections的 ...
- [翻译]Web开发牛人访谈:你们都在用什么?
小肥鱼译注:早上看到这篇文章,觉得内容甚是有趣.作者跟web开发方面的诸多大牛进行了交流,了解到他们的研究动向,从访谈中可以看到各种风格的开发者,有浏览器控,有设备控.我想,知道行业里的优秀成员在做些 ...
- Linux安装JRE tomcat配置java环境
安装JRE 到http://www.oracle.com/technetwork/java/javase/downloads/index.html下载JRE软件. 1.wget http://down ...
- 融云rongCloud聊天室的使用
融云提供了两种途径的接口, 一个是app端,一个是服务器端的. app端 1.连接融云,监听消息 rong = api.require('rongCloud2'); rong.init(functio ...
- StarkSoft题库管理系统
一.功能介绍 1.自定义试题库管理系统目录.难易程度,题型,知识库等. 2.试题录入. 3.强大的试题编辑功能,并与通常应用编辑工具有共通. 4.灵活的试卷构造功能,用户可自定 ...
- maven(基础介绍一)
maven:提供的作用有以下几点: 1 jar包依赖 这个也许会maven最突出的特点了使用maven不需要上网单独下载jar包,只需要在配置文件pom.xml中配置jar包的依赖关系,就可以自动的下 ...
- WEB前端必备掌握知识
1.跨域: 跨域问题是由于javascript语言安全限制中的同源策略造成的.
- PHP PDO SQLSERVER
$bbs = new PDO("odbc:MSSQLServer", $username_bbs, $password_bbs $bbs = new PDO('); $s ...