力扣(leecode)刷题中使用到的哈希表UThash是什么

在leecode刷题的时候经常看到用到哈希表的官方题解中都是直接调用UThash,可以用来检测是否有重复元素出现。这其实是一个在GitHub上开源的非常优秀的对哈希表的实现。
下载地址:https://github.com/troydhanson/uthash
下载下来是一个压缩包,里面只有一个文件夹uthash-master,随便解压缩到一个能找到的地方。打开它,打开里面的src文件夹然后把这个路径复制下来。
力扣(leecode)刷题中使用到的哈希表UThash是什么
我这里复制出来的路径就是C:\Users\11543\Desktop\CS\uthash-master\src
之后打开VS2010(其他版本也类似)新建项目之后找到“项目-属性”

力扣(leecode)刷题中使用到的哈希表UThash是什么
在打开的页面里点击“配置属性——VC++目录——包含目录——右边的小三角——编辑”

力扣(leecode)刷题中使用到的哈希表UThash是什么
在新打开的页面里点击“新行”,然后把刚刚复制的路径粘贴进输入框中,点击右下角确定就ok了。(或者在输入框右边有三个点,点开那个然后就在里面定位到uthash-master——src目录中点击选择文件夹。)

力扣(leecode)刷题中使用到的哈希表UThash是什么
这样就算配置完成了,在代码中直接输入include“uthash.h”就可以使用了。(这里我的代码是“217.寻找重复元素”中官方题解的代码)

力扣(leecode)刷题中使用到的哈希表UThash是什么
下面是最最基本的用法。
完整用法可以参考

  1. 官方英文使用文档:http://troydhanson.github.io/uthash/userguide.html#_add_item
  2. 一篇对这个文档的翻译博客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不会替你完成这件事。也就是说你必须先用查找功能保证没有了才能插入(这也是正常使用中要自定义函数接口的意义)。

这道题中就只用到了这两个功能,就先只介绍这两个功能。

上一篇:_ZNote_Qt_Tips_添加动态链接库


下一篇:542. 01 Matrix 广度优先算法 二维矩阵 python