美文网首页
Boolan C++ STL与泛型编程_5

Boolan C++ STL与泛型编程_5

作者: 竹林柳岸 | 来源:发表于2017-06-22 22:45 被阅读0次
    主要内容:

    标准库中除STL之外的内容。

    1. 一个万用的hash function

    • hash function设计原则:产生的hash code尽可能减少冲突, 使元素能够尽可能多的落在不同的篮子里。
    • unordered_set两种使用方法:一种是针对需要存放的元素类型,定义泛函数。另一种是定义一个hash_function。
    • 设计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的功能。

    相关文章

      网友评论

          本文标题:Boolan C++ STL与泛型编程_5

          本文链接:https://www.haomeiwen.com/subject/ptmwqxtx.html