uthash宏参考

news/2024/4/27 10:57:28/文章来源:https://blog.csdn.net/yuyuyuliang00/article/details/129167927

快捷宏

快捷宏做与一般化宏相同的事情,但需要较少参数。

为了使用便捷宏。

  1. 1、结构体的UT_hash_handle字段必须被命名为hh
  2. 2、对于增加或查找,这个键字段必须是int或者char[]或者指针类型

表格:便捷宏

参数
HASH_ADD_INT(head, keyfield_name, item_ptr)
HASH_REPLACE_INT(head, keyfield_name, item_ptr, replaced_item_ptr)
HASH_FIND_INT(head, key_ptr, item_ptr)
HASH_ADD_STR(head, keyfield_name, item_ptr)
HASH_REPLACE_STR(head, keyfield_name, item_ptr, replaced_item_ptr)
HASH_FIND_STR(head, key_ptr, item_ptr)
HASH_ADD_PTR(head, keyfield_name, item_ptr)
HASH_REPLACE_PTR(head, keyfield_name, item_ptr, replace_item_ptr)
HASH_FIND_PTR(head, key_ptr, item_ptr)
HASH_DEL(head, item_ptr)
HASH_SORT(head, cmp)
HASH_COUNT(head)

一般的宏

这些宏添加,查找,删除以及排序在一个哈希中的项。如果你的UT_hash_handle被命名为处了hh外的其它名称或者如果你的键数据类型不是int或char[],你需要使用一般宏。

参数
HASH_ADD(hh_name, head, keyfield_name, key_len, item_ptr)
HASH_ADD_BYHASHVALUE(hh_name,head,keyfield_name,key_len,hashv,item_ptr)
HASH_ADD_KEYPTR(hh_name,head,key_ptr,key_len,item_ptr)
HASH_ADD_KEYPTR_BYHASHVALUE(hh_name,head,key_ptr,key_len,hashv,item_ptr)
HASH_ADD_INORDER(hh_name,head,keyfield_name,key_len,item_ptr,cmp)
HASH_ADD_BYHASHVALUE_INORDER(hh_name,head,keyfield_name,key_len,hashv,item_ptr,cmp)
HASH_ADD_KEYPTR_INORDER(hh_name,head,key_ptr,key_len,item_ptr,cmp)

HASH_ADD_KEYPTR_BYHASHVALUE

_INORDER

(hh_name,head,key_ptr,key_len,hashv,item_ptr,cmp)
HASH_REPLACE

(hh_name,head,keyfield_name,key_len,item_ptr,

replaced_item_ptr)

HASH_REPLACE_BYHASHVALUE

(hh_name,head,keyfield_name,key_len,hashv,item_ptr,

replaced_item_ptr)

HASH_REPLACE_INORDER

(hh_name,head,keyfield_name,key_len,item_ptr,

replaced_item_ptr,cmp)

HASH_REPLACE_BYHASHVALUE

_INORDER

(hh_name,head,keyfield_name,key_len,hashv,item_ptr,

replaced_item_ptr,cmp)

HASH_FIND(hh_name, head, key_ptr, key_len, item_ptr)
HASH_REPLACE_BYHASHVALUE(hh_name,head,key_ptr,key_len,hashv,item_ptr)
HASH_DELETE(hh_name, head, item_ptr)
HASH_VALUE(key_ptr, key_len, hashv)
HASH_SRT(hh_name, head, cmp)
HASH_CNT(hh_name, head)
HASH_CLEAR(hh_name, head)
HASH_SELECT

(dst_hh_name, dst_head, src_hh_name, src_head,

condition)

HASH_ITER(hh_name, head, item_ptr, tmp_item_ptr)
HASH_OVERHEAD(hh_name, head)

注意:当这个结构体包含一个指向这个键的指针时,使用HASH_ADD_KEYPTR,而不是这个键自身。

HASH_VALUE和..._BYHASHVALUE宏一种性能机制,主要针对j具有不同结构体,在不同哈希表中,具有相同键的特殊情况。它允一旦获取了哈希值,并且接着在..._BYHASHVALUE宏中被传入,节省了重新计算哈希值的开销。

参数描述:

1) hh_name:在这个结构体中UT_hash_handle字段的名称。方便地被称为hh。

2)head:结构体指针变量,它用作这个哈希表的"头"。如此命名,因为它初始指向被添加到这个哈希表的第一项。

3)keyfield_name:在这个结构体中的键字段的名称。(在一个多字段键的情况中,这是这个键的第一个字段。)

4)key_len:这个键字段的长度(字节为单位),例如,对于一个整数键,这是sizeof(int), 而对于字符串键,它是strlen(key)。

5)  key_ptr:对于HASH_FIND,这是一个指向这个键的指针,来在哈希表中查找(由于它时一个指针,你不能直接在这里传递一个字面值)。对于HASH_ADD_KEYPTR,这是被添加的项的键的地址。

6) hashv:指定键的哈希值。这是一个用于..._BYHASHVALUE宏的输入参数,以及一个用于HASH_VALUE的输出参数。如果你将要进行重复查找相同键,反复使用一个缓存的哈希值是一种性能优化。

7) item_ptr:指向被添加,删除,替换或查找的结构体的指针,或者在迭代过程中,当前指针。这是用于HASH_ADD, HASH_DELETE和HASH_REPLACE宏的输入参数,以及用于HASH_FIND和HASH_ITER的输出参数。(当使用HASH_ITER来迭代时,tmp_item_ptr是与item_ptr相同类型的另一个变量,被内部使用。)

8) replaced_item_ptr:在HASH_REPLACE宏中使用。这是一个输出参数,其被设置为指向被替换项(如果没有项被替换,它被设置为NULL)。

9) cmp:指向比较函数的指针,这个函数接收两个参数(指向要比较的项的指针),并且返回一个指明第一项是否应该排在第二项前,等于或之后的整数。(如:strcmp)

10) condition:一个函数或宏,它接收单个参数(一个指向一个结构体的void指针,其需要被转成何时的结构体类型)。如果这个结构体应该被选择用于添加到目标哈希表,函数或宏计算为一个非0值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73607.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基本介绍与常用操作指令

参考链接: Linux面试必备20个常用命令_无 羡ღ的博客-CSDN博客_linux常用命令 1. Linux简介 Linux是一个支持多用户、多任务、多线程和多CPU的操作系统,特点是免费、稳定、高效, 一般运行在大型服务器上。 1.1 常用目录简介 /:根目…

【华为OD机试模拟题】用 C++ 实现 - 数组的中心位置(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

MES系统需求误区,一文告诉你需求分析有哪些

在企业的实际应用中,对MES系统需求的分析常常会出现六个错误。 要求广泛,目标不明确由于对MES系统的概念和企业的实际运作不了解,导致企业在提出MES系统的要求时,常常会笼统而不明确,有时会混淆目标和需要。比如&#…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (五)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

复现SCI文章:配对连线、散点箱线图

今天我们要复现的是一篇SCI文章的配对连线箱线图,配对箱线图、或者说配对连线图我们之前有写过(ggplot做分组配对连线图、ggplot2|ggpubr配对箱线图绘制与配对检验、复现NC图表-配对小提琴的绘制(理解绘图函数内部底层机制)&#…

关于用windows开发遇到的各种乌龙事件之node版本管理---nvm install node之后 npm 找不到的问题

友情提醒,开发最好用nvm控制node版本 nrm 控制镜像源,能少掉很多头发开发过程中技术迭代更新的时候最要老命的就是 历史项目的node版本没有记录,导致开启旧项目的时候就会报错。尤其是npm 升级到8.x.x以后,各种版本不兼容。 真…

Homekit智能家居DIY一WIFI智能插座

WiFi智能插座对于新手接触智能家居产品更加友好,不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷,智能插座就是其中之一,比如外出忘记关空调,可以拿起手机远程关闭。 简单说就是:插座可以连接wi…

VMware ESXi 7.0 Update 3k - 领先的裸机 Hypervisor (sysin Custom Image)

VMware ESXi 7.0 Update 3k - 领先的裸机 Hypervisor (sysin Custom Image) VMware ESXi 7.0 Update 3k Standard & All Custom Image for ESXi 7.0 U3k Install CD 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3/,查看最新版。原创作品…

ChatGPT爆火:AI崛起,这些职场人的机遇到了?

ChatGPT最近真的被全球吃瓜群众玩坏了! 回答情感问题,编写代码,撰写slogan或脚本,甚至还被用于毕业生论文…… 这个连马斯克都由衷地称赞的ChatGPT,是一种全新的聊天机器人模型。上线2个月,就拥有了上亿活…

04--WXML

1、什么是WXML什么是Wxml呢?我们首先要介绍一下Html,Html的全称为HyperTextMarkup Language,翻译过来就是超文本标记语言,这种语言目前已经普遍用于前端开发,而wxml正是从html演变而来,它基于微信这个平台&…

SQL server设置用户只能访问特定数据库、访问特定表或视图

在实际业务场景我们可能需要开放单独用户给第三方使用,并且不想让第三方看到与业务不相关的表或视图,我们需要在数据库中设置一切权限来实现此功能: 1.设置用户只能查看数据库中特定的视图或表 1.创建用户名 选择默认数据库 服务器角色默认…

__stack_chk_fail问题分析

一、问题进程收到SIGABRT信号异常退出,异常调用栈显示__stack_chk_fail*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: Pico/A7H10/PICOA7H10:10/5.5.0/smartcm.1676912090:userdebug/dev-keys Revision: 0 ABI: arm64 Times…

Web前端学习:一

编辑器的基础使用 编辑器推荐使用: HBuilderx(免费中文)(建议使用) Sublime(免费英文) Sublime中文设置方法,下载语言插件: 1、进入Sublime后,ShiftCtrlP…

wait/notify方法 等待唤醒机制

线程正在运行,调用这个线程的wait()方法,这个线程就会进入一个集合进行等待(这个集合的线程不会争抢cpu),此时线程的状态就是waiting 当有线程调用notify()方法的时候,就会从集合中挑选一个线程进入到排队队列里面 notifyAll就是…

【样式】轮播图样式 uview 版本 : “2.0.31“

![在这里插入图片描述](https://img-blog.csdnimg.cn/6cd568ce932b4ea7ae52f10365979680.png html <view class"addSwiperdiv"><image src"/static/66.png" mode"aspectFill" class"titleimg"></image><view c…

VC++ 解决dll库动态库加载失败问题(调用LoadLibrary加载失败)(附源码)

目录 1、动态加载dll库去调用库中的函数 1.1、调用系统dll库中未公开的接口 1.2、调用控件库中的注册接口向系统中注册该控件 2、LoadLibrary动态加载dll库失败的场景 2.1、自制安装包中遇到的LoadLibrary加载dll库失败问题 2.2、主程序底层模块调用LoadLibrary加载dll库…

秒杀测试案例 Java Redis Mysql

基于redis和MySQL乐观锁实现秒杀优惠券场景&#xff0c;一人一单。MySQL乐观锁改良控制不出现超卖和少卖问题&#xff0c;使用redisson分布式锁在用户维度加锁控制一人一单。 源码&#xff1a;https://github.com/hanhanhanxu/SeckillTest 文中图片看不清的地方可以鼠标右键-&…

谷歌外推留痕,谷歌搜索留痕快速收录怎么做出来的?

本文主要分享谷歌搜索留痕的收录效果是怎么做的&#xff0c;让你对谷歌留痕技术有一个全面的了解。 本文由光算创作&#xff0c;有可能会被修改和剽窃&#xff0c;我们佛系对待这样的行为吧。 谷歌搜索留痕快速收录怎么做出来的&#xff1f; 答案是&#xff1a;通过谷歌蜘蛛…

C语言-结构体对齐

详细说明参考博客 (1条消息) C语言结构体对齐&#xff0c;超详细&#xff0c;超易懂_haozigegie的博客-CSDN博客 (1条消息) #pragma pack详解_OuJiang2021的博客-CSDN博客_#pragma pack 以下个人理解总结 出现结构体对齐考虑的根本原因就是&#xff1a;【数据存取执行效率】…

Openwrt中动态IPV6 防火墙的正确设置方法

环境&#xff1a;光猫桥接公网IPV6 问题&#xff1a;动态IPV6地址不知道怎么设置防火墙 解决办法&#xff1a;模糊匹配前缀&#xff0c;特定后缀 背景&#xff1a;将家中光猫桥接后&#xff0c;获得了公网的IPV6地址&#xff0c;可以从外部用IPV6访问家中的设备&#xff0c;但I…