主要内容:
标准库中除STL之外的内容。
1. 一个万用的hash function
- hash function设计原则:产生的hash code尽可能减少冲突, 使元素能够尽可能多的落在不同的篮子里。
- unordered_set两种使用方法:一种是针对需要存放的元素类型,定义泛函数。另一种是定义一个hash_function。
-
设计hash function:
计算hash code时,0x9e3779b9是借用的黄金比例。
2. tuple 元之组合,数之组合
- eg. tuple<string, int, int, complex<double>> t; //sizeof(t) = 32.?
tuple<int, float, string> t1(41, 6.3, "nice"); - get<0>(t1)取t1的第0个元素。get<1>(t1)取t1的第1个元素...
- auto t2 = make_tuple(22, 44, "stacy"); //创建一个tuple,并写入元素。
- get<1>(t1) = get<1>(t2); //assign value
- tuple之间可以比较大小。
tie绑定,将tuple中对应的各个元素绑定到tie中。
tuple_size获取tuple中value个数。
tuple_element获取tuple中第几个元素的类型。 - tuple会自动递归,把元素分隔为head和tail, tail会再分隔为head和tail, 直到tail只有一个元素为止。层层继承, tail作为基类,head作为数据成员。
3. type traits 类型萃取器
3.1 type_traits的定义
- 回答class中的默认构造、拷贝构造、拷贝赋值、析构函数重要不重要、是否是POD(plain old data, c风格的结构,没有成员函数)等,默认是false。对于自己定义的类型,可以自己定义__type_traits的特化版本。
3.2 type_traits的使用
string的析构函数不是虚函数,string的设计上是不打算让用户继承的。has_virtual_destructor是0.,is_polymorphic(是否有多态)是0。
Zoo(const Zoo&) = delete; 不要编译器默认的。
Zoo(Zoo&&) = default; 要编译器默认的搬移构造函数, 和用户不写意义相同。
Zoo& operator=(const Zoo&) = default;
Zoo& operator=(const Zoo&&) = delete; //不要编译器默认的搬移赋值函数。
萃取器可以得知以上这四个函数是否需要编译器给的。
3.2 type_traits的实现原理
- is_void的实现:is_void类模板继承自__is_void_helper类模板,首先对类型去除const、volatile属性,再传给__is_void_helper,利用它的泛化和特化void,判断是否是void。
- is_integral的实现:也是先除去const和volatile属性,再利用__is_integral_helper的泛化和偏特化判断,如果不是和某种特化版本匹配的类型,那么就会使用泛化版本,泛化版本的回答是false。
- 有些type_traits的实现找不到源代码,是由编译器实现的。
4. cout
sub_match对正则表达式的输出。
对自定义类型用cout输出,要重载<<.
5. moveable(c++11)
- 两种拷贝方式:
eg. M c11(c1);
M c12(std::move(c1)); - 对于红黑树的insert(ite, v1type(buf)), 如果不该放到ite指定的位置,还是会放到它应该放的位置。
- vector如果不事先设置大小的话,那么当长度不够的时候要两倍增长,所以拷贝的次数就增多了,使用move虽无法减少拷贝的次数,但是可以提高拷贝构造的效率。
- 对其他stl容器的拷贝构造的效率影响不大。
- move assignment, move constructor是浅拷贝。
- string是具有moveable的功能。