文章目录
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的历史: