当前位置: 首页 > news >正文

c语言中GHashTable的使用(2)

**前言:在上一个文章的基础上增加一些实用的功能,目的在与解决如何利用(a,b)组成的key存储数据

构建hash表g_hash_table_new

//free的函数需要根据自己的实际情况去写,以我自己的结构体为例,在数组里面动态开辟的空间需要循环释放
//使用73856093和19349663解决哈希冲突,也可以自己更改其他的方式
typedef struct
{double *species_density;double cell_electric_V[4];double size;int relative_position;int cell_count;int neighbor_relation[8]; double *species_density_max; double pseudo_collision_max; 
} InterfacePoint;
typedef struct
{InterfacePoint *arr;guint count;
} Value;
void free_value_emc(gpointer data)
{Value *val = data;for (guint i = 0; i < val->count; ++i){g_free(val->arr[i].species_density);g_free(val->arr[i].species_density_max);}g_free(val->arr);g_free(val);
}
guint key_hash(gconstpointer key)
{const keyEmc *k = key;return (guint)(k->cell_count * 73856093) ^ (k->time_step * 19349663);
}
gboolean key_equal(gconstpointer a, gconstpointer b)
{const keyEmc *k1 = a;const keyEmc *k2 = b;return k1->cell_count == k2->cell_count && k1->time_step == k2->time_step;
}
void free_key(gpointer data)
{g_free(data);
}
g_hash_table_new_full(key_hash, key_equal, free_key, free_value);

存储方法
这里为了存储类型(1,1.1)形式的key,选择在插入时为y*10000,查询需要同步修改,不影响查询结果

//table hash表,(x,y):key,data_array:存储的数组,一次存储的数组数量
void insert_data_emc(GHashTable *table, int x, double y, InterfacePoint *data_array, guint data_count);void insert_data_emc(GHashTable *table, int x, double y, InterfacePoint *data_array, guint data_count)
{if (data_count > MAX_ARR_SIZE){g_printerr("Error: data_count超过最大容量 %d\n", MAX_ARR_SIZE);return;}
// 创建keyint key_y = (int)(y * 10000);key *key = g_new(keyEmc, 1);key->cell_count = x;key->time_step = key_y;// 看有没有已存在的valueEmcValue *existing = g_hash_table_lookup(table, key);if (existing){// 已有记录,追加但不超过MAX_ARR_SIZEguint can_add = MAX_ARR_SIZE - existing->count;guint to_copy = (data_count < can_add) ? data_count : can_add;for (guint i = 0; i < to_copy; i++){existing->arr[existing->count++] = data_array[i];}g_free(key); // key没插入hash表,自己要释放}else{// 新建valueValue *val = g_new(EmcValue, 1);val->arr = g_new(InterfacePoint, MAX_ARR_SIZE);val->count = 0;for (guint i = 0; i < data_count; i++){val->arr[val->count++] = data_array[i];}g_hash_table_insert(table, key, val);}}

查询方式
如果插入时给y10000,这里就也需要1000

int key_y = (int)(y * 10000);key lookup = {x, key_y};Value *val = g_hash_table_lookup(table, &lookup);
http://www.lqws.cn/news/70651.html

相关文章:

  • DeepSeek模型性能优化:从推理加速到资源调度的全栈实践
  • JS手写代码篇---手写类型判断函数
  • 鸿蒙进阶——Mindspore Lite AI框架源码解读之模型加载详解(一)
  • 【Part 3 Unity VR眼镜端播放器开发与优化】第二节|VR眼镜端的开发适配与交互设计
  • 【数据库】关系数据库标准语言-SQL(金仓)下
  • Oracle expdp过滤部分表数据
  • Unity中应对高速运动的物体,碰撞组件失效的问题?
  • 如何在 Windows 11 24H2 的任务栏时钟中显示秒数
  • 【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡
  • DDR5舍入定义和算法Rounding Definitions and Algorithms详细讲解
  • 设备驱动与文件系统:03 生磁盘的使用
  • React 18 生命周期详解与并发模式下的变化
  • SQL快速入门【转自牛客网】
  • 数智管理学(十六)
  • azure devops 系列 - 常用的task
  • BUUCTF[极客大挑战 2019]Secret File 1题解
  • 动态规划(10):状态压缩
  • 【AUTOSAR SystemServices】深入解析StbM模块:功能定义、工作原理与代码实现
  • Modern C++(二)预处理器及表达式
  • 概率统计:AI大模型的数学支柱
  • imgsz参数设置
  • 数据结构与算法:图论——拓扑排序
  • [RoarCTF 2019]Easy Calc
  • 常见ADB指令
  • 数据库系统概论(十六)数据库安全性(安全标准,控制,视图机制,审计与数据加密)
  • JavaScript性能优化
  • [android]MT6835 Android 指令启动MT6631 wifi操作说明
  • 【大模型学习】项目练习:视频文本生成器
  • 【C盘瘦身】给DevEco Studio中HarmonyOSEmulator(鸿蒙模拟器)换个地方,一键移动给C盘瘦身
  • Python发送天气预报到企业微信解决方案