Background
这一节是非常短的。我们简单的扩展上一节的内容来画一个三角形。
在这一节中我们再一次在规范化空间中安排我们的顶点坐标。能够看见的顶点一定要在盒子内部,这样视口矩阵才能将这些顶点映射到窗口可以看见的地方。当我们忽略 Z 轴时,我们看到的盒子如下图:
首先,我们可以将所有东西都放在一个.cpp文件内,编译器会将这个.cpp编译成.obj,即编译单元。一个程序可以由一个编译单元组成,也可以由多个编译单元组成。一个.cpp对应一个.obj.
然后将所有的.obj链接起来(通过一个叫链接器的程序),组成一个.exe,即程序。如果一个.cpp要用到另一个.cpp定义的函数怎么办,只需在这个.cpp中写上它的函数声明。
链接器将所有的obj链接起来,但是如果碰巧有相同的函数或外部变量怎么办?C++可以通过一种叫做链接属性的关键字来限定,某个函数是属于整个程序公用的,还是只在一个编译单元obj里面使用,这些关键字就是extern(外部链接)和static(内部链接)。
让我们说说.h。其实没有.h,程序也能很好的工作,但是当你发现一个外部链接的函数或外部变量,需要许多分声明,因为只要使用到该函数的单元,就必须写一份声明在那个.cpp里面,如果要修改会很麻烦!!!.h就是为了解决这个问题而诞生的,它包含了这些公共的东西,然后所有需要使用该函数的.cpp,只需要用#include包含进去便可,以后需要修改,只是修改一份内容。
#include并不是什么申请指令,只是将指定文件的内容,原封不动的拷贝进来。
不是很严格的讲,*.h
文件做的是类的声明,包括类成员的定义和函数的声明,而 *.cpp
文件做的类成员函数的具体实现(定义)。一个 *.h
文件和 *.cpp
文件一般是配对的。在*.cpp
文件的第一行一般也是#include "* .h"
文件,其实也相当于把 *.h
文件里的东西复制到*.cpp
文件的开头。所以,你全部写在*.cpp
文件其实也是一样的。
看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿,呵呵。
我们平常知道是排序算法都是O(n),最好的情况也就是O(nlogn),怎么会有O(n)的呢。
不过实际上,在数字范围有限制的情况下,(必须是数字才行的吧)是有一个这样的算法的,只需要用一个数组记录每个数字出现次数就可以了。
假定你的数字范围在0到65535范围之内,定义一个数组count[65536](这个空间是常量,和n无关,所以是O(1) ),初值全部为0。
那么假设有下面这些数字:1
2
3
4
5
6
7100
200
300
119
0
6
...