• c++ 函数指针简单实例


    一开始看函数指针的时候我是很懵的,因为不知道它有什么用,之后慢慢就发现了自己的愚昧无知。

    假设我们想实现一个数据结构,比如二叉搜索树,堆。又或者是一个快排,归并排序。

    我们一般是直接在两个数要比较的时候直接采用运算符比较大小,但是这样的缺点是,如果我要大顶堆就要单独写大顶堆,小顶堆也要单独实现。

    很明显这样的代码复用性很低,两串除了比较运算符不同其他全部相同的代码自己看着也难受,这个时候就是函数指针出马的时候了。比如下面我写的这个堆

    #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 }
    快速排序

    同理其他排序也可以做到这样

  • 相关阅读:
    团队与领导力健康检查 | 体检表
    如何改变组织文化
    如何在各种文化背景下成功敏捷
    OKR痛点与误区 | 敏捷家分享007
    Scrum培训感想
    如何讲好故事
    Lc70_爬楼梯
    Lc641_设计循环双端队列
    Lc32_最长有效括号
    Lc239_滑动窗口最大值
  • 原文地址:https://www.cnblogs.com/DCD112358/p/10665707.html
Copyright © 2020-2023  润新知