天天看點

用C++一步步寫算法Day_1

          這是受到朋友推薦的一位 神級人物部落格

的啟發,開始有了繼續學習C++的路徑和方法,接下來的很長一段時間,我将通過從寫簡單的算法開始一步步學習和熟練C++文法和對所寫代碼的健壯性測試。結合《資料結構和算法分析C++》第三版作為參考。

           數組查找算法,主函數是find(),用關鍵字template定義了類模闆,尖括号中的内容相當于函數的參數清單,<變量類型  變量名稱>, 這裡用了不太容易混淆的typename代替别的類型,比如class。type就是我們自己定義的類型名稱,也可以用T或Type。

        當模闆被調用時,type将被具體的類型值(int & string)代替,後面就使用了int代替了!在main.h中也要在聲明前加上類模闆開頭。

        用指針來實作數組元素的查找,提高了代碼運作效率,首先定義頭尾指針分别指向int數組的頭和尾的位址:

start :0x7fff3c5297d0

end : 0x7fff3c5297f8

d0到f8 ,位址距離是40bit,int長度是4bit,是以數組長度是10,也就是length的值。注意我們用int定義的數組,其長度機關也是int,而位址顯示是按位計算的!

        下面我們在看下數組元素的位址,就清楚啦!

0 -> 0x7fff2dc8b520

1 -> 0x7fff2dc8b524

2 -> 0x7fff2dc8b528

3 -> 0x7fff2dc8b52c

4 -> 0x7fff2dc8b530

5 -> 0x7fff2dc8b534

6 -> 0x7fff2dc8b538

7 -> 0x7fff2dc8b53c

8 -> 0x7fff2dc8b540

9 -> 0x7fff2dc8b544

start -> 0x7fff2dc8b520

end  -> 0x7fff2dc8b548

        下面是我運作的完整代碼:

        main.h

#ifndef MAIN_H_
#define MAIN_H_

static void test1();
static void test2();

template<class type>
int find(type array[], int length, type value);


#endif
           

       man.cpp

#include "main.h"
#include <assert.h>
#include <cstdio>
#define FALSE 1
#define TRUE 0

template<typename type>
int find(type array[], int length, type value)
{
    if(NULL == array || 0 == length)
        return FALSE;

    type* start = array;
    type* end = array + length;
    while(start < end){
        if(value == *start)
            return (start - array);
        start ++;
    }

    return FALSE;
}

static void test1()
{
    int array[10] = {0};
    assert(FALSE == find<int>(NULL, 10, 10));
    assert(FALSE == find<int>(array, 0, 10));
}

static void test2()
{
    int array[10] = {1, 2};
    assert(0 == find<int>(array, 10, 1));
    assert(FALSE == find<int>(array, 10, 10));
}
int main()
{
    test1();
    test2();
    return TRUE;
}           
上一篇: vim基本配置
下一篇: Day_2

繼續閱讀