C++学习32:侯捷C++11,14新特性(标准库部分)

1 Rvalue references and Move Semantics

1.1 知识内容

右值引用:为了避免非必要的拷贝操作。move类似“浅拷贝”,只是把指针指向另一个位置,可以理解为“偷”,因此不同于copy的“深拷贝”。
首先先了解一下左值和右值的定义:
在这里插入图片描述
在这里插入图片描述
关于右值引用,如何告诉编译器呢?答案是&&
浅拷贝是危险的,两根指针指向同一个位置。因此被move之后,就不要再使用move前的了,之前的指针要设为nullptr,这样保证只有一根指针。
在这里插入图片描述
例子如下:
在这里插入图片描述
为了避免遗失(传的时左值却被认定为右值,或相反),需要进行forward的学习:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 move实战

在这里插入图片描述
在这里插入图片描述
对容器的性能测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于vector
在这里插入图片描述
在这里插入图片描述

2 新的容器

这部分在前面STL中已经学习过。

2.1 array

2.2 hashtable

2.3 forward_list

3 其他重要东西

3.1 hash functions

给unordered容器所用的哈希表进行算法处理,将每个元素给予其标号的方法。
在这里插入图片描述
实现方式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面我们来看一下G4.9的源码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 万用的hash functions

形式1:
前面讲哈希表时说过Hash Function,在为整数时即标号为自己,为字符串类型时进行一个逐位运算。有没有一种可以直接万用的Hash Function呢?我们进行如下学习,见下图:
在这里插入图片描述
同样的东西,左边是成员函数,而右边是全局函数。
在这里插入图片描述
左上角的情况:可以运作,但碰撞很多,太过天真。
而右上角的情况:hash_val根据不同的参数类型,按顺序调用不同的重载的函数(黑色的圈1,圈2,圈3)。其中圈1调用了可变模板参数,逐个处理每一个(见:),一步步走到左下方。

综上,来看一下这个Hash Function的源码:
在这里插入图片描述
形式2:
在这里插入图片描述
在这里插入图片描述

3.3 tuple

将多个类型整合到一起:
在这里插入图片描述
不是28而是32的原因,暂无解释。。。
源码如下:
在这里插入图片描述
基础:可变参数模板,简单来说就是:分成一个和一堆,把n分为1和n-1,随后继续将n-1分为1和n-2,这样不断递归。代码中体现为...。详见:
tuple最神秘的地方:有个private继承,继承一部分自己(Tail部分的自己),故可以递归继承,形成上图右边的继承顺序情况。终止条件:递归继承到空的tuple<>。

来看一下tuple的历史:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值