|
本帖最后由 小小小小鸟 于 2023-7-28 18:48 编辑
已过时:由于火山PC的一些特性,无法在嵌入代码的<include></include>中使用自定义类的数据类型(除了指针和引用),使得在定义哈希表类型时如果是自定义类,便无法通过编译,之前的解决办法是值类型设置为变整数存入对象指针然后再读指针处对象(或者用对象包装类再强制类型转换),本源码通过将类成员变量 unordered_map改为变整数(指针) 来实现支持任意值类型(然后在具体方法中实现变整数指针到unordered_map的变化引用,长的让人心累),另外扩充 HashFunc来完善键的哈希计算,就不用分开定义 基础值类型和文本型与字节集的模板类了,最终实现通用哈希表模板类(改自"飞翔的企鹅"的封装代码,感谢大佬的付出):
已过时: 模板类型1-key: 基本数据类型(字节,短整数,整数,长整数,变整数,小数,字符,文本型,字节集类)
已过时: 模板类型2-value: 任意数据类型,包含基本数据类型和各种类
2023-07-23:已过时:改变了写法,用 @def_marco和 @m<XX>简化了在各个方法中的指针到对象变换,火山源码的可读性好了一点,但是翻译成CPP仍然是很长
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: 任意数据类型,包含基本数据类型和各种类。
如有问题,请指正~
|
|