uthash用户使用指南
- uthash支持哪些操作
- 如何使用uthash
- 定义可以使用作hash表的结构体
- 关于内存
- 声明哈希表
- 添加元素
- 查找元素
- 删除元素
- 遍历元素
- 计数
- 排序
我们利用哈希表可以通过键值对的方式处理元素,即哈希表中存储键-值形式的数据,关键字是唯一的。uthash是利用结构体,宏定义等形式实现的一个具有哈希表特点和功能的开源代码模块。
uthash支持哪些操作
1.添加/替换(add/replace)
2.查找(find)
3.删除(delete)
4.计数(count)
5.遍历(iterate)
6.排序(sort)
如何使用uthash
添加头文件即可
#include "uthash.h"
定义可以使用作hash表的结构体
struct hashTable{int key;char name[10];UT_hash_handle hh; /*使结构体作为哈希表的关键*/
};
关于内存
可以使用HASH_OVERHEAD字段查看哈希表的开销大小(以字节为单位)
声明哈希表
struct hashTable *hashtable=NULL;
/*hash表必须声明为指向你定义的结构体的空初始化指针*/
添加元素
void add_key(int ikey,char *name){struct hashTable *tmp;HASH_FIND_INT(hashtable,&ikey,tmp);if(tmp==NULL){tmp=malloc(sizeof(struct hashTable));tmp->key=ikey;HASH_ADD_INT(hashtable,key,tmp);}strcpy(tmp->name,name);
}
HASH_ADD_INT()的第一个参数为哈希表,第二个参数是键字段名称,最后一个参数是指向要添加的结构的指针。
HASH_ADD_INT:为键类型为int的哈希表添加元素;uthash还提供
HASH_ADD_STR():字符串类型,HASH_ADD_PTR():指针类型
将哈希指针传递给函数,应该写成
void add_user(struct hashTable **users,int user_id,char *name){HASH_ADD_INT(*users,id,s);
}
查找元素
struct hashTable *find_key(int ikey)
{struct hashTable* tmp;HASH_FIND_INT(hashtable,&ikey,tmp);return tmp;
}
删除元素
void delete_key(struct hashTable * tmp)
{HASH_DEL(hashtable,tmp);free(tmp);
}
遍历元素
void delete_all(){struct hashTable *current_user, *tmp;HASH_ITER(hh,hashtable,current_user,tmp){HASH_DEL(hashtable,current_user);free(current_user);}
}
计数
unsigned int num_users;
num_users=HASH_COUNT(hashtable);
排序
int by_key(const struct hashTable*a,const struct hashTable*b)
{return (a->key-b->key);
}
HASH_SORT(hashtable,by_key);