c++ 函數指針簡單實例
阿新 • • 發佈:2019-04-07
二叉 wap src pla 實現 == mes show nbsp
一開始看函數指針的時候我是很懵的,因為不知道它有什麽用,之後慢慢就發現了自己的愚昧無知。
假設我們想實現一個數據結構,比如二叉搜索樹,堆。又或者是一個快排,歸並排序。
我們一般是直接在兩個數要比較的時候直接采用運算符比較大小,但是這樣的缺點是,如果我要大頂堆就要單獨寫大頂堆,小頂堆也要單獨實現。
很明顯這樣的代碼復用性很低,兩串除了比較運算符不同其他全部相同的代碼自己看著也難受,這個時候就是函數指針出馬的時候了。比如下面我寫的這個堆
#include<bits/stdc++.h> using namespace std; const int MAXN = 100007; typedefbool (*PF)(int,int);///這句定義意思是:PF類型是指向bool (int, int)類型函數的函數指針 bool cmp1(int a, int b) {return a<b;}/// bool cmp2(int a, int b) {return a>b;}/// struct Heap{ int siz; int num[MAXN]; bool (*cmp)(int,int);///參數傳大於就是大頂堆 Heap(PF pf = cmp2):siz(0),cmp(pf) {};///默認用大頂堆的比較函數大頂堆 void shift_up(intnow) { while(now>>1) { if(cmp(num[now], num[now>>1])) { swap(num[now], num[now>>1]); now>>=1; } else break; } } void shift_down(int now) { int point; while(now<<1<=siz) { point= now<<1; if(now<<1^1 <= siz && cmp(num[now<<1^1], num[now<<1])) point ^= 1; if(cmp(num[point], num[now])) { swap(num[point], num[now]); now = point; } else break; } } bool Empty() { return siz; } int Top() { return siz?num[1]:-1; } void Pop() { if(siz == 0) return ; num[1] = num[siz--]; shift_down(1); } void Push(int val) { if(siz+1 == MAXN) return; num[++siz] = val; shift_up(siz); } };
(如果寫錯了告訴我一下,我寫完沒嚴謹的測試一下, 因為重點是講函數指針)
上面那個函數裏面有一個函數指針;
這個指針在構造函數裏初始化是cmp2,為了構建大頂堆。
但是我們要小頂堆也很容易,Heap hh(cmp1);這樣定義出來的hh就是小頂堆,同理我們就可以實現自己的二叉搜索樹等等。
比如下面的這個快排就是用傳入的函數指針來排序,這樣可以升序降序都沒問題。、
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN = 100007; 4 typedef bool (*PF)(int,int);///這句定義意思是:PF類型是指向bool (int, int)類型函數的函數指針 5 bool cmp1(int a, int b) {return a<b;}/// 6 bool cmp2(int a, int b) {return a>b;}/// 7 int single_sort(int l, int r, int num[], PF cmp=cmp1){ 8 int key=num[l]; 9 while(l<r){ 10 while(l<r&&cmp(key,num[r])) 11 --r; 12 num[l]=num[r]; 13 while(l<r&&cmp(num[l], key)) 14 ++l; 15 num[r]=num[l]; 16 } 17 num[l]=key; 18 return l; 19 } 20 void qsort(int l, int r, int num[], PF cmp=cmp1){ 21 if(l+1>=r) return; 22 int k = single_sort(l, r, num, cmp); 23 qsort(l, k, num, cmp); 24 qsort(k+1, r, num, cmp); 25 } 26 int main() { 27 int num[10]={1, 2, 3 ,4 ,5 ,7, 6, 8, 9, 0}; 28 qsort(0, 9, num, cmp2); 29 for(int i=0; i<10; ++i){ 30 printf("%d ", num[i]); 31 } 32 }快速排序
同理其他排序也可以做到這樣
c++ 函數指針簡單實例