Boolan C++ STL与泛型编程_5

主要内容:

标准库中除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的功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值