在leecode刷题的时候经常看到用到哈希表的官方题解中都是直接调用UThash,可以用来检测是否有重复元素出现。这其实是一个在GitHub上开源的非常优秀的对哈希表的实现。
下载地址:https://github.com/troydhanson/uthash
下载下来是一个压缩包,里面只有一个文件夹uthash-master,随便解压缩到一个能找到的地方。打开它,打开里面的src文件夹然后把这个路径复制下来。
我这里复制出来的路径就是C:\Users\11543\Desktop\CS\uthash-master\src
之后打开VS2010(其他版本也类似)新建项目之后找到“项目-属性”
在打开的页面里点击“配置属性——VC++目录——包含目录——右边的小三角——编辑”
在新打开的页面里点击“新行”,然后把刚刚复制的路径粘贴进输入框中,点击右下角确定就ok了。(或者在输入框右边有三个点,点开那个然后就在里面定位到uthash-master——src目录中点击选择文件夹。)
这样就算配置完成了,在代码中直接输入include“uthash.h”就可以使用了。(这里我的代码是“217.寻找重复元素”中官方题解的代码)
下面是最最基本的用法。
完整用法可以参考
或者找其他写的比较好的博客学习
就对应着上面的那段代码来简单说一下用法
首先需要创建一个结构体
struct hashTable { int key; UT_hash_handle hh; };
UT_hash_handle hh;
这行代码是用来表明这个结构体是一个哈希表类型,照抄就可以。
key就是你想存储的数据,什么类型都可以(只是我目前只用过int类型)。
另外在使用时必须先定义一个该结构体的空指针,用于指向保存数据的hash表(官方文档原文,没看懂)。一定要置为空,名字随便起,后面有用。
struct hashTable* set = NULL;
查找:
struct hashTable* tmp = NULL; HASH_FIND_INT(set, nums + i, tmp);
HASH_FIND_INT();
插入:
tmp = (struct hashTable*)malloc(sizeof(struct hashTable)); tmp->key = nums[i]; HASH_ADD_INT(set, key, tmp);
HASH_ADD_INT();
注意,必须先确保哈希表里没有相同元素才能插入,UThash不会替你完成这件事。也就是说你必须先用查找功能保证没有了才能插入(这也是正常使用中要自定义函数接口的意义)。
这道题中就只用到了这两个功能,就先只介绍这两个功能。