一、一个万用的Hash Function
1、形式1:函数形式
#include <functional>
class Customer{
// ...
};
size_t customer_hash_func(const Customer& c){
// return ...;
}
int main(){
unordered_set<Customer,size_t(*)(const Customer&)> custset(20,customer_hash_func);
}
2、形式2:类形式
#include <functional>
class Customer{
// ...
};
class CustomerHash{
public:
std::size_t operator()(const Customer& c)const{
//return ...;
}
};
int main(){
unordered_set<Customer,CustomerHash> custset;
}
源码实例
unordered_set底层容器使用的哈希表。
函数执行的顺序如下,
(1)首先进入main函数中,红色箭头所指的行,进入之后,会调用Customer的构造函数,即1;
(2)在执行hh(CustomerHash)的()重载运算符,即2;
(3)根据hash_val函数寻找其对应重载的函数,找到3;
(4)接下来执行4,4的函数里面是一个递归,会执行5;
(5)直到args里面的参数仅有一个的时候会执行6。
存在问题:
我创建unordered_set<Customer,CustomerHash> setx,但是调用setx.insert(Customer("ace","han",1)); 会失败,有会的可以讨论一下怎么处理。
3、形式3:以struct hash偏特化形式实现Hash Function
?二、Tuple(元组)
1、tuple的简单代码测试
?2、Tuple节录并简化版本
?3、tuple的继承关系
?以tuple<int,float,string>为例,tuple<int,float,string>继承tuple<float,string>,tuple<float,string>继承于tuple<string>,tuple<string>继承于tuple<>。
三、type traits
1、用法
该头文件定义了一系列类,以获得有关编译时的类型信息。
头文件包含:
- Helper类:帮助创建编译时常量的标准类。
- 类型特征:以编译时常量值的形式获取类型特征的类。
- 类型转换:类通过将特定的转换应用于现有类型来获取新类型。
类型的基本特征是可以对其进行分类的类别。这是有关这些类别如何重叠的图表:
?C++11的type_traits
?type_trais测试
?在mian函数中添加
?(1)int类型测试
?(2)结构体类型测试
?(3)类测试
?2、type_traits实现is_void
?3、type_traits实现is_integral
?4、type_traits实现is_move_assignable
本文暂时没有评论,来添加一个吧(●'◡'●)