首页 > 其他分享 >【glibc】glib库hash表GHashTable介绍

【glibc】glib库hash表GHashTable介绍

时间:2024-01-22 10:36:38浏览次数:17  
标签:glib hash glibc value --- GHashTable free key table

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,  " 1 " ,  " one " );
    g_hash_table_insert(table,  " 2 " ,  " two " );
    g_hash_table_insert(table,  " 3 " ,  " three " );
    g_hash_table_insert(table,  " 4 " ,  " four " );
    g_hash_table_insert(table,  " 5 " ,  " 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,  " 3 " ));
    g_hash_table_replace(table,  " 3 " ,  " third " );
    printf( " After replace: 3 ---> %s /n" , g_hash_table_lookup(table,  " 3 " ));

    g_hash_table_remove(table,  " 2 " );
    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   0 ;
}


通过代码我们看到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动态分配内存

 

标签:glib,hash,glibc,value,---,GHashTable,free,key,table
From: https://www.cnblogs.com/opensmarty/p/17979420

相关文章

  • 【glibc】glib库队列GQueue介绍
    队列是一种向最后添加条目,从最前删除条目的数据结构,这种数据结构在处理按顺序到达的数据是很有用。glib库提供的队列GQueue是一个双端队列,它的实现基础是双向链表,所以它支持在队列的两端进行添加和删除,也支持很多其它的操作,比如在队列中进行插入和删除,但是我不推荐使用这样的功能......
  • spring--CGLIB动态代理的实现原理
    CGLIB(CodeGenerationLibrary)是一个强大的、高性能、高质量的代码生成库,它可以在运行时扩展Java类和实现Java接口。CGLIB动态代理是基于继承的方式来实现的,它不需要接口,可以代理普通类。以下是CGLIB动态代理的实现原理:继承:CGLIB动态代理通过继承目标类来创建子类,并在......
  • spring--JDK动态代理和CGLIB代理的区别
    JDK动态代理和CGLIB代理是Java中常用的两种动态代理实现方式,它们各有特点和适用场景:JDK动态代理:JDK动态代理是基于接口的代理方式,它使用Java反射机制来创建代理对象,并要求目标对象实现一个或多个接口。在代理过程中,JDK动态代理会创建一个实现了目标对象所有接口的代......
  • /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found问题解决
    有一个go实现的项目代码最近有更新,自己在开发环境上手动构建并运行都没有问题(构建和运行时相同环境,肯定没有问题^_^)。后面通过jenkins构建镜像也没有问题,运行时却报错 之前的版本在jenkins上构建也是成功的,后沟通得知jenkins集群版本最近有更新 那么,大概知道原因了,由于jenk......
  • GLIBC修复笔记
    微信公众号:运维开发故事作者:wanger背景公司环境有台机器硬盘故障,需要安装megacli工具进系统查看raid信息,在ubuntu20.04安装megacli解决依赖过程中失误将高版本的libtinfo包装系统上了,导致系统报glibc对应的版本没有找到,系统实际glibc的版本是2.31。解决办法如果系统的ssh没有断开,可......
  • 解决/lib64/libc.so.6: version `GLIBC_2.14' not found(Linux环境)
    ......
  • 高版本gcc编译出的程序在低版本glibc机器上运行
    比如我们用gcc9.3.0编译程序,但需要发布的机器gcc版本是4.8.5,怎么办?你可能想到如下方法静态编译容器发布打包依赖的so,使用本地so运行程序1.静态编译将libc和libstdc++静态编译,编译时带上如下参数。g++-static-libgcc-static-libstdc++glibc并不推荐静态链接,你依赖......
  • 在idea中无法查看org.springframework.cglib.core.Signature.java 源码
    一、现象1.点击ideaDownloadSource,没有变化;ChouseSource也无济于事。2.打开下载的源码包,惊奇的发现确实没有对应的源码。3.问题发生在哪儿?原来是这些包原本不属于spring,spring在编译的时候直接修改了包名称。 ......
  • No package 'glib-2.0' found
     001、./configure命令报错如下: Nopackage'glib-2.0'found 002、查找改文件[[email protected]]#find/-name"glib-2.0.pc"##只在conda环境中存在/root/anaconda3/pkgs/glib-2.69.1-he621ea3_2/lib/pkgconfig/glib-2.0.pc/root/anaconda3/li......
  • fsm.h:24:37: fatal error: glib.h: No such file or directory
     001、make编译报错如下:fsm.h:24:37:fatalerror:glib.h:Nosuchfileordirectory 002、查找该文件(base)[[email protected]]#find/-name"glib.h"##存在该文件,但是有可能是找不到 003、查找相关的系统安装包(base)[root@pc1exonerate-2.......