第二章-作业问题
1、
Is it possible to replace:是否可以将视频里向量扩容代码中的:
for (int i = 0; i < _size; i++) _elem[i] = oldElem[i];
in the vector expansion code in the video with: 替代为:
memcpy(_elem, oldElem, _size * sizeof(T));
P.S.This question involves the relevant knowledge of C++ P.S.本题涉及C++的相关知识
否,因为后者能否达到目的与元素类型T有关。
解析:当T为非基本类型且有对应的赋值运算符以执行深复制时,前一段代码会调用赋值运算符,而后一段只能进行浅复制。
浅复制就是将指针复制过去,不开辟新空间,也就是把_elem的值赋值为_oldElem。深复制是开辟新空间,再复制值。
2、分摊复杂度和平均复杂度的结果并没有必然联系
3、operator使用
Box operator+(const Box&, const Box&);
4、在函数体前加const,意味着返回值为敞亮,不能被改变。
5、返回值为引用,意味着可以作为左值——对这个函数的返回值进行改变,绘会直接改变向量中原本的值。
6、函数指针?为啥传函数要传函数指针呢?和直接传函数有什么区别?
好像就得传函数指针。
7、什么是函数对象?
大概就是用operator重载(),看起来和用起来都像函数叭!
是一个类class的实例(对象),不过这个对象有函数的功能呢!
8、类的构造函数是什么?
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。
https://www.runoob.com/cplusplus/cpp-constructor-destructor.html
9.struct也是与class一样吗?或者这个有啥用
而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。
C++中的 struct 和 class 基本是通用的,唯有几个细节不同:
(1)使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。
(2)class 继承默认是 private 继承,而 struct 继承默认是 public 继承(《C++继承与派生》一章会讲解继承)。
(3)class 可以使用模板,而 struct 不能(《模板、字符串和异常》一章会讲解模板)。
10、virtual的作用
virtual是一个虚函数,也就是继承的类再次用这个函数名定义函数时,这个函数在继承类中会覆盖base class中的函数。
https://blog.youkuaiyun.com/qq_27278957/article/details/78019809
11、注意二分查找时,[lo,hi)。直接用给的lo和hi,不要再瞎处理,改编hi的值了,hi就是开区间的。(虽然不知道这样做有什么好处,但是都这样做,应该问题不大)。
如果瞎处理了hi,让它为hi-1的话,这题容易错选为A。
12、这题出的不错。提两个概念:
(1)查找长度:比较次数
(2)比较:是比大小;比对:判断想不想等
这题里面两个有序数组的长度相同,查找的元素的相对位置相同,尽管两个元素的大小不一样,但是他们在向量中的相对位置是一样的,所以使用同样的查找方式的话【就我目前所知的查找方法/算法】,比较次数(查找长度)应该是相同的。
13、Fib查找的理解不太好,看看习题答案。卡了半天的原因是没有用mi来更新数值,反而用V【mi】来更新边界值。整体代码理解就是 —在斐波那契数列中找到刚刚好大于目前数列长度的那个数,凭借其数列间相邻数字具有黄金分割例的关系,找到其前一个数值,将次数值,作为mid,这个mid就具有了黄金分割比例,也就是我们求的最优复杂度的那个比例。其他的和二分法差不多,最大的区别就是mid的选取方式。
14、先用实际发生交换的次数进行交换,在这个最后一次交换的时候,sorted=False。然后,再进行一趟扫描,发现已排好序,此时sorted=true,结束。所以是+1,选B。【后面,再改进的算法虽然返回的是last,但是最后一趟排序后,仍旧是返回最后的逆序的Rank,不能结束循环。同理,需要再扫描一次,不改变last的初值(lo),这样才可以结束循环】。
15、主要是理解稳定性这个概念。
稳定:同样大小的数,排序后,相对位置不变。(相对位置改变就是不稳定)
16、归并排序和二路归并还是要区分一下的。归并排序是指冯诺依曼提出的,先分为两份;分别排序;再二路归并。这种时间复杂度为O(nlogn)。
二路归并是两个排好序的,再放入一个内,时间复杂度为O(n)。
有一个需要记住的:归并排序,最好最坏,都是O(nlogn)