在這回的學習中,我們能體會到泛型演算法的威力,這是通過模板(抽象)實現的
泛型演算法是一種用對其所用的資料結構進行盡可能少的假設的方法表達的演算法,模板使得泛型(genericity)更為容易
首先來看乙個簡單的例子,假設我們想找整形陣列中第乙個等於某個給定值的元素,**很簡單,如下:
const int* find(const int* array, int n, int x)
還可以進一步進行抽象,因為我們的start和end不一定非得是個指標
template t* find(s s, s b, const t& x)
接下來我們來見證這個演算法是怎麼泛化的,也就是說對於非陣列的資料結構,我們如何來使用這個演算法
下面以煉表為例進行說明,看看鍊錶如何使用這個演算法
假設我們的鍊錶節點型別如下:
struct node
很容易我們可以得到查詢鍊錶特定元素的演算法,如下:
node* listfind(node* s, node* b=0, const int& x)
顯然我們的listfind函式與我們最終的find演算法函式非常類似,不要奇怪,因為他們解決的是同樣乙個問題,只是針對不同的資料結構,所以演算法形式的一致是不足為奇的(這就是抽象的魅力所在!)
要對鍊錶應用通用的find函式,我們還需要定義乙個輔助類,這個輔助類要建立鍊錶與這個演算法之間的聯絡,並且這個輔助類要能夠支援!= * ++,為了能更好的理解,我們可以先設想這個輔助類應該是實現stl容器中的迭代器的功能
我們將這個輔助類命名為nodep,具體定義如下:
class nodep
; int& operator*()
void operator++()
friend bool operator!=(const nodep&, const nodep&);
operator node*() //型別轉換符
private:
node* pt;
};bool operator!=(const nodep& p, const nodep& q)
該說明的都說明了,現在我們來乙個綜合示例,**如下:
#include using namespace std;
template s find(s s, s b, const t& x) // 泛型演算法
struct node //鍊錶節點定義
;typedef node* list;
class nodep //輔助類,輔助鍊錶使用通用泛型演算法
; int& operator*()
void operator++()
friend bool operator!=(const nodep&, const nodep&);
operator node*() //型別轉換符
private:
node* pt;
};bool operator!=(const nodep& p, const nodep& q)
list createlist(int* p) //建立鍊錶
return head;
}void main()
; list l= createlist(a);
nodep start(l);
nodep end(0);
nodep n = find(start,end,4);
node* p = n;
cout << p->value;
}
總結:記住,利用模板寫出的函式,不僅可以適用於不同的引數型別,還可以使用於不同的資料結構
也許有人會疑問,既然為了讓特定的資料結構使用通用演算法,我們需要定義乙個輔助類,為什麼直接使用我們的普通演算法(比如listfind)呢?要解開這個疑惑,請假設有m個資料結構和n個演算法,如果我們不使用泛型,則資料結構和演算法之間的對映有m*n個,也就是說針對每個資料結構的每個演算法我們都需要去定義,而如果使用泛型,則我們只需要定義m個輔助類和n個演算法,o(m*n)與o(m+n),那個更好呢?
C 沉思錄讀書筆記(三)
乙個物件導向的程式範例 物件導向程式設計的3個要素 資料抽象 繼承及動態繫結。這個例程非常完整的展示了這3個要素。程式要做的內容就是要將這個算術表達樹輸出,即得到 5 3 4 expressions標頭檔案 ifndef expression h h define expression h h in...
《軟體管理沉思錄》讀書筆記
沉思錄 是一本經典哲學著作,哲學又被稱為 關於智慧型 的學科,那麼對於 軟體管理沉思錄 我們可以理解為它是關於軟體管理的智慧型。相較於之前讀的啟發式的軟體工程管理類的經典書籍,本書的語言更直白,想闡明什麼觀點都會明明白白地告訴你。本書對於寫讀書筆記來說是友好的,看每部分的標題即可知道文章內容,不必再...
模組和泛型演算法 C 沉思錄
include include using namespace std 關於find使用的資料結構,我們必須知道那些情況呢?1.我們正在查詢某個型別為int的值 2.我們正在乙個int物件陣列中進行查詢 3.我們已經預先知道了陣列中的元素的數目 4.我們知道了第乙個元素的位址 const int f...