在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.寻找重复元素”中官方题解的代码)
下面是最最基本的用法。
完整用法可以参考
- 官方英文使用文档:http://troydhanson.github.io/uthash/userguide.html#_add_item
- 一篇对这个文档的翻译博客https://blog.csdn.net/fan_h_l/article/details/107241520
或者找其他写的比较好的博客学习
就对应着上面的那段代码来简单说一下用法
首先需要创建一个结构体
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();
- 第一个参数就是最开始让定义的那个空白指针。
- 第二个参数是你要查找的key值(注意是指针类型,这里的nums是个数组,本来就是地址,如果要查一个int类型的数记得前面加“&”取地址)。
- 第三个参数是如果找到的话就存在第三个参数里面,所以新建了一个指针作为容器(找不到就不给tmp赋值)。
插入:
tmp = (struct hashTable*)malloc(sizeof(struct hashTable));
tmp->key = nums[i];
HASH_ADD_INT(set, key, tmp);
HASH_ADD_INT();
- 第一个参数还是开头那个空白指针
- 第二个参数是结构体中对应的成员名称(结构体中定义的是int key;如果定义int key1;这里就填key1)
- 第三个参数是要插入的数据,已经提前放在结构体里面了。
注意,必须先确保哈希表里没有相同元素才能插入,UThash不会替你完成这件事。也就是说你必须先用查找功能保证没有了才能插入(这也是正常使用中要自定义函数接口的意义)。
这道题中就只用到了这两个功能,就先只介绍这两个功能。