1. 程式人生 > >c++ 函數指針簡單實例

c++ 函數指針簡單實例

二叉 wap src pla 實現 == mes show nbsp

一開始看函數指針的時候我是很懵的,因為不知道它有什麽用,之後慢慢就發現了自己的愚昧無知。

假設我們想實現一個數據結構,比如二叉搜索樹,堆。又或者是一個快排,歸並排序。

我們一般是直接在兩個數要比較的時候直接采用運算符比較大小,但是這樣的缺點是,如果我要大頂堆就要單獨寫大頂堆,小頂堆也要單獨實現。

很明顯這樣的代碼復用性很低,兩串除了比較運算符不同其他全部相同的代碼自己看著也難受,這個時候就是函數指針出馬的時候了。比如下面我寫的這個堆

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100007;
typedef 
bool (*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(int
now) { 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++ 函數指針簡單實例