【源码】更新-魔改无序哈希表,真正意义支持任意火山类型
本帖最后由 小小小小鸟 于 2023-7-28 18:48 编辑已过时:由于火山PC的一些特性,无法在嵌入代码的<include></include>中使用自定义类的数据类型(除了指针和引用),使得在定义哈希表类型时如果是自定义类,便无法通过编译,之前的解决办法是值类型设置为变整数存入对象指针然后再读指针处对象(或者用对象包装类再强制类型转换),本源码通过将类成员变量 unordered_map改为变整数(指针) 来实现支持任意值类型(然后在具体方法中实现变整数指针到unordered_map的变化引用,长的让人心累),另外扩充 HashFunc来完善键的哈希计算,就不用分开定义 基础值类型和文本型与字节集的模板类了,最终实现通用哈希表模板类(改自"飞翔的企鹅"的封装代码,感谢大佬的付出):
已过时:模板类型1-key: 基本数据类型(字节,短整数,整数,长整数,变整数,小数,字符,文本型,字节集类)
已过时:模板类型2-value: 任意数据类型,包含基本数据类型和各种类
**** Hidden Message *****
2023-07-23:已过时:改变了写法,用 @def_marco和 @m<XX>简化了在各个方法中的指针到对象变换,火山源码的可读性好了一点,但是翻译成CPP仍然是很长**** Hidden Message *****
2023-07-28:通过使用std::remove_pointer_t 省去了复杂的指针到unordered_map的转换,保留了 unordered_map 作为类成员变量,更加简化了各个方法中的代码。在HashFunc和EqualFunc中通过模板SFINAE和操作符重载,简化了写法,并且实现了key是自定义类的可能型。PS:越来越觉得c++模板实在太优雅了~要学的东西太多了···
模板类型1-key: 任意数据类型,包含基本数据类型和各种类。当key为自定义类时,建议自行实现GetHash方法或继承可哈希基类覆盖GetHash方法,否则会调用默认哈希函数返回1,此时相当于链表结构(加上外层包装甚至还不如),检索方式从头到尾,对大量数据极不友好。
模板类型2-value: 任意数据类型,包含基本数据类型和各种类。
**** Hidden Message *****
如有问题,请指正~
6666666666 66666666666 不知道这样改会不会有问题。因为吴总竟然把xx到字节集哈希表给注释了,据说是存在问题。。但是我给取消注释用着也没啥问题。。 感谢分享 shuimiao 发表于 2023-7-21 13:08
不知道这样改会不会有问题。因为吴总竟然把xx到字节集哈希表给注释了,据说是存在问题。。但是我给取消注释 ...
我自己测试也没发现问题,只要字节集类的构造和析构没有问题,按理说是不会有问题的 66666666666 支持开源 谢谢分享
支持开源