剑指offer总结

时间复杂度一般比空间复杂度更重要,因为改进时间对算法的要求更高。

是空间换时间,还是时间换空间,一般要看具体的应用。
对于普通的应用,一般是空间换时间,因为普通用户更关心速度,而且一般有足够的存储空间允许这样操作。
对于嵌入式的软件,一般我们会用时间换空间,一般嵌入式设备的存储空间太少了。

程序员的编程习惯对代码的时间效率有很大影响,C/C++程序员要养成采用** 引用(指针)**来传递复杂类型参数的方式。

如果是采用值传递的方式,则从形参到实参会产生一次复操作,这样的复制操作是多余的,我们应该尽量避免。

树是链表和递归组成的

泛型编程:函数模板的本质是类型的参数化

函数模板和普通函数的区别:

  1. 函数模板将严格的按照类型进行匹配,不会进行自动类型转换
    普通函数的调用:可以进行隐式的类型转换
  2. 函数模板可以像普通函数一样被重载
  3. 如果函数模板可以产生一个更好的匹配,那么选择模板
  4. 可以通过空模板实参类型列表的语法来限定编译器只能通过模板匹配

当函数模板和普通函数都符合调用规则时,优先选择普通函数
若显式的使用函数模板,则使用**<>**类型列表

c++编译器模板机制剖析

思考:

  1. 为什么函数模板可以和函数重载放在一起?
  2. C++编译器是如何提供函数模板机制的?

C++编译器并不是把函数模板处理成能够匹配任意类型的函数
编译器从函数模板通过具体的类型产生不同的函数
C++编译器是通过两次编译实现的:

  1. 在函数声明的地方对模板代码本身进行编译:词法、语法、句法的分析
  2. 在调用的地方对参数替换后的代码进行编译。

模板将数据结构的表示和算法不收数据类型的影响

模板
模板类是抽象的(本身是类型化的) =======> 具体的类 ===========> 必须记性类型具体

类模板做函数参数
类模板的继承问题:

  1. 从模板类派生普通类
  2. 从模板类派生模板类

模板类在派生时必须使用固定的类型进行派生

要从内存的角度思考问题,类型的本质是固定大小内存块的别名,必须有确定的类型,C++编译器才能确定如何分配内存。

变量做参数,指针做参数,引用做参数
变量做参数会调用copy构造
引用做参数不会调用copy构造
指针做参数

你可能感兴趣的:(剑指offer总结)