一个万用的hashFunction
以HashTable为底层的容器(如unordered_map),在使用过程中,必须要有一个hash function来为每一个元素生成一个hash code作为元素在哈希表中的key,也就是元素在哈希表中的具体位置。对于一些build-in类型(比如字符串),标准库自带hash function,对于自定义类型来说,这个函数该如何定义?我们能否找到一个通用的方法,实现hash code的计算呢?
- 一个万用的hashfunction
template<typename... Types>
inline size_t hash_val(const Types&... args){
size_t seed = 0;
hash_val(seed, args...);
return seed;
}
template<typename T, typename... Types>
inline void hash_val(size_t& seed, const T& val, const Type&... args){
hash_combine(seed, val);
hash_val(seed, args...);
}
#include<functional>
template<typename T>
inline void hash_combine(size_t& seed, const T& val){
seed = std::hash<T>(val) + 0x9e3779b9
+ (seed << 6) + (seed >> 2);
}
//auxiliary generic funtions
template<typename T>
inline void hash_val(size_t& seed, const T& val){
hash_combine(seed, val);
}
seed最终就被视为hash code
touple
就是元组,实现了将不同类型数据打包到一个数组中(其实就是Python中的touple)
实现:
type_traits
type traits(类型萃取机)能有效地分辨类是否具有某种类型,通过调用它我们可以实现对不同的类型指定不同的操作。
struct __true_type{};
struct __false_type{};
//泛化
template<class type>
struct __type_traits{
typedef __true_type this_dummy_member_must_be_first;
typedef __false_type has_trivial_default_constructor;
typedef __false_type has_trivial_copy_constructor;
typedef __false_type has_trivial_assignment_operator;
typedef __false_type has_trivial_destructor;
typedef __false_type is_POD_type; //POD = Plain Old Data,代表旧式的class 也就是struct
};
//int的特化
template<>
struct __type_traits<int>{
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
}
//double的特化
template<>
struct __type_traits<double>{
typedef __true_type has_trivial_default_constructor;
typedef __true_type has_trivial_copy_constructor;
typedef __true_type has_trivial_assignment_operator;
typedef __true_type has_trivial_destructor;
typedef __true_type is_POD_type;
}
moveable
一个可移动的元素对STL算法有巨大的影响,不可移动的元素会进行深拷贝,容器中存储的是类的对象,则每次拷贝都要调用构造函数。而一个moveable对象在拷贝时可以拷贝指针,即浅拷贝。这效率是非常高的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。