一个万用的hash function

C++候捷stl-视频笔记4插图
哈希函数的形式,一种是一般函数(右边),一种是成员函数(左边),类的对象将成为函数对象
C++候捷stl-视频笔记4插图(1)
具体做法例子。直接把属性的所有hash值加起来,会在hashtable中会产生很多的碰撞,放在同一个bucket中的元素会多

另一种是使用可变模板参数来做的hash_val()函数,产生种子,经过复杂的操作,得到hash值。
版本1接受任意个数模版参数,版本2函数参数第一个是size_t(版本1产生的seed),重复调用版本2,直到剩一个模版参数,调用版本3
C++候捷stl-视频笔记4插图(2)
利用struct hash的偏特化来实现hash function
C++候捷stl-视频笔记4插图(3)
特化实现例子

Tuple用例

C++候捷stl-视频笔记4插图(4)
tuple用法示例
C++候捷stl-视频笔记4插图(5)
tuple 继承 tuple
通过递归定义使得 tuple 类模板可以方便地处理可变数量的模板参数,每一层递归处理一个参数。这也是元编程中常见的技术,通过递归和继承来处理可变数量的参数。

type traits

C++候捷stl-视频笔记4插图(6)
默认的 __type_traits 进行了一系列泛化的设定
C++候捷stl-视频笔记4插图(7)
C++候捷stl-视频笔记4插图(8)
C++候捷stl-视频笔记4插图(9)
C++候捷stl-视频笔记4插图(10)
traits测试例子

type traits实现

is_void
C++候捷stl-视频笔记4插图(11)

// 通过范围偏特化实现remove const
template <typename _Tp>
struct remove_const
{ typedef _Tp type };
template <typename _Tp>
struct remove_const<_Tp const>
{ typedef _Tp type };
// remove volatile 同理

is_integral
C++候捷stl-视频笔记4插图(12)

cout

C++候捷stl-视频笔记4插图(13)
各种类对<<操作符的重载,以实现在标准输出设备上输出
C++候捷stl-视频笔记4插图(14)

movable元素对于不同容器速度效能的影响

C++候捷stl-视频笔记4插图(15)
由于vector的底层会两倍空间扩展,在扩展的时候会调用拷贝构造,所以这里调用次数为7194303,明显大于三百万
C++候捷stl-视频笔记4插图(16)
C++候捷stl-视频笔记4插图(17)
C++候捷stl-视频笔记4插图(18)
C++候捷stl-视频笔记4插图(19)
内存实际非连续的容器影响不大
C++候捷stl-视频笔记4插图(20)
C++候捷stl-视频笔记4插图(21)
move操作就是”浅拷贝”,用新指针指向数据,打断旧指针

C++候捷stl-视频笔记4插图(22)
C++候捷stl-视频笔记4插图(23)
对于 vector 这样的容器,其用 move 就只是 swap 了三根指针
C++候捷stl-视频笔记4插图(24)
string带有movable的功能,从&&右值可以看出

本站无任何商业行为
个人在线分享 » C++候捷stl-视频笔记4
E-->