Divide And Conquer

Merge Sort: void Merge(int list[], int lowIndex, int highIndex, int midIndex) {    int *tempList = new int[highIndex-lowIndex+1];    int firstLow = lowIndex;    int secondLow = midIndex + 1;    int index = 0;    while(firstLow <= midIndex && secondLow <= highIndex)    {       if (list[firstLow] < list[secondLow])      …

Recursion

递归生成某集合的所有序列: template <class T> void Swap(T& a, T& b) {    T temp = a;    a = b;    b = temp; } template <class T> void Permulation(T list[], int k, int m) {    if (k == m)    {       for (int i = 0; i <= m; i++)  …

3N+1

int threeN(int n) {    if (n%2==0)       return n/2;    else       return n*3+1; } int getLength(int n) {    static map<int, int> history;    int key = n;        if (n == 1)       return 1;    if (history.find(key) != history.end())       return…

链表

1. 逆转链表 typedef struct Node {    int Data;    Node *Next; }; Node *ReverseList(Node *pHead) {    Node *pReverseHead = NULL;    while (pHead != NULL)    {       Node *pTmp = pHead;       pHead = pHead->Next;       pTmp->Next = pReverseHead;       pReverseHead = pTmp;  …

设计类时要考虑的问题

1. 你的类需要构造函数吗?其访问控制级别怎样? 2. 数据成员需要设计成私有的吗? 3. 需要无参的构造函数吗? 4. 需要析构函数吗?需要设计成虚析构函数吗? 5. 需要复制构造函数吗 如果在构造函数中分配资源,则需要复制构造函数 6. 需要赋值操作符吗? 检查自我赋值 释放旧值, 复制新值 7. 需要定义关系运算符吗? 8. 参数类型需要加上 const 吗? 9. 成员函数需要时 const 吗?

引用与指针的区别

指针和引用都是用来间接访问对象的,他们之间有什么区别呢?何时用指针?何时用引用?为什么? 1. 首先认识到指针可以初始化为NULL而引用则不可以。 一个引用变量必须引用到某个对象上, 而且一旦初始化一个引用后,这个引用只能访问这个对象,而不能重新给该引用赋值到其他对象,即关系一旦建立,就不能解除。 因此当你需要一个变量可以间接访问其他对象时, 你需要使用指针。 因为一个引用必须关联到某个对象, 因为在定义引用时必须初始化:string &rs; // 错误: 引用变量必须初始化string s(“xyzzy”);string &rs = s; // okay, rs引用s 指针没有这个限制:string *ps; // 未初始化的指向string的指针 2. 指针可以重新指向其他的对象, 引用只能指向他初始化的对象,可以说引用像一个指针常量。

C++ Best Practice

Watch out for bugs introduced in the constructor of base and other parent classes. Make sue an object is fully constructed before calling any virtual function. 在基类的构造函数中调用虚函数很容易引起bug,因为在构造派生类对象的时候先调用基类的的构造函数,因为此时派生类对象还没有构造完全,如果基类中的虚函数在派生类中重写了,那么基类不会调用这些虚函数,而是调用中的虚函数实现, 很容易引起bug。

理解C/C++语言声明的优先级规则

A 声明从它的名字开始读取,然后按照优先级顺序依次读取B 优先级从高到底依次是 声明中被括号括起来的那一部分 后缀操作符: 括号()表示这是一个函数,而方括号[]表示这是一个数组 前缀操作符: 星号 * 表示“指向...的指针” C 如果const和(或) volatile关键字后面紧跟类型说明符(如int,long等), 那么它作用于类型说明符,在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。 例如, 声明 char * const *(*next)();A     首先变量名为“next”, 并注意到它直接被括号括住B.1  把括号里作为一个整体,得出“next是指向…的指针”B     考虑括号外面的东西, 在星号*前缀和()后缀间作选择,根据优先级规则,()优先级较高,所以next是一个函数指针,指向一个返回…的函数B.3  处理前缀“*”, 得出指针所指的内容C     最后把char * const解释为指向字符的常量指针 根据分析可以概括出: next是一个指针,它指向一个函数,该函数的参数列表为空,并返回一个指针,返回的指针指向一个类型为指向char的常量指针。