**# array
内部就是一个数组,只是将其包装为一个容器array;使其融入STL;
G4.9版:
hashtable(不是新东西)
(1)基本类型都有对应的hash function;hash可以看出基本类型的hash function应该是一个模板
(2)上面是对hash的测试,可以看例如hash()(123),其中hash()是创建了临时对象,然后(123)应该是重载的()运算符,返回值即为hash code;
(3)在C++2.0之前,标准库中没有对于string的hash function;
标准库中hashfuntion的实现
(1)一个泛化版本,和若干个特化;对于数值直接利用数值;
(2)右侧调用接口为int i=hash()(32);因此,如果自己写一个Foo的hash function也需要有相同的接口在hash特化中重载()运算符;
怎么自己写一个hash function
(1)产生出的hash_code越乱越好,不要重复;
(2)以类customer为例,以它为元素放在容器里,然后计算它的hash_code;
(3)上图中形式2设计为一般函数,形式1设计为成员函数;
(4)右侧调用函数时,形参为函数类型size_t(*)(const Customer&),左侧会自动产生一个函数对象;
(5)原子拆分,再相加形成hash function太过天真;分的有fname,lname都是string基本类型有自己的hash function,以及num是Long类型;就是在用hash_function的特化版本;把各自的hash_code简单相加,这样会碰撞多,一个篮子的链表过长;
(6)调用库中的函数hash_val;
一个万用的hashfution
(1)template<typename…Types>新增,可以添加任意多个模板参数;variadic template;
(2)1和2的区别在于第一个参数分别是size_t&和const Type&…;
(3)1,2,3是函数重载;用最泛化的版本分离参数个数,1分为seed和所有传入(例如3个)的参数,然后调用2,在2中调用自己hash_val(seed,args…),分为seed,val,和另外2个参数,然后重复分解;过程中依次每次取出一个参数做seed的变化用;当只剩下seed和位移参数时,到3执行;
(4)将不定量的参数不断拆解;
tuple容器
(1)为什么是32,现在无法解释;子类是父类相加总的内存;
(2)get<0>(t1)是拿出tuple t1的第一个参数;之前7个(可变模板参数)例子之一的.tail().head()比较难用,标准库给出了直接获取参数的函数;
(3)然后是对=,<,<<的重载运算符;
(4)tie是捆绑,是将tie的三个参数给t3;tie(i1,f1,s1)=t3;
(5)右下角,tuple_size<>::value和tuple_element<>::type这种用法,这些是对类型做操作;称为meta programming原编程;
tuple历史—sutpid的做法,没有可变模板参数这种“屠龙刀”
(1)写到哪里处理多少个,写到15就处理到15;
(2)下图有人继承上图想法,写到了15;