c++ 函数指针简单实例
一开始看函数指针的时候我是很懵的,因为不知道它有什么用,之后慢慢就发现了自己的愚昧无知。
假设我们想实现一个数据结构,比如二叉搜索树,堆。又或者是一个快排,归并排序。
我们一般是直接在两个数要比较的时候直接采用运算符比较大小,但是这样的缺点是,如果我要大顶堆就要单独写大顶堆,小顶堆也要单独实现。
很明显这样的代码复用性很低,两串除了比较运算符不同其他全部相同的代码自己看着也难受,这个时候就是函数指针出马的时候了。比如下面我写的这个堆
#include<bits/stdc++.h>
using namespace std;
const int MAXN = ;
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(),cmp(pf) {};///默认用大顶堆的比较函数大顶堆
void shift_up(int now) {
while(now>>) {
if(cmp(num[now], num[now>>])) {
swap(num[now], num[now>>]);
now>>=;
} else break;
}
}
void shift_down(int now) {
int point;
while(now<<<=siz) {
point = now<<;
if(now<<^ <= siz && cmp(num[now<<^], num[now<<]))
point ^= ;
if(cmp(num[point], num[now])) {
swap(num[point], num[now]);
now = point;
} else break;
}
}
bool Empty() { return siz; }
int Top() { return siz?num[]:-; }
void Pop() {
if(siz == ) return ;
num[] = num[siz--];
shift_down();
}
void Push(int val) {
if(siz+ == MAXN)
return;
num[++siz] = val;
shift_up(siz);
}
};
(如果写错了告诉我一下,我写完没严谨的测试一下, 因为重点是讲函数指针)
上面那个函数里面有一个函数指针;
这个指针在构造函数里初始化是cmp2,为了构建大顶堆。
但是我们要小顶堆也很容易,Heap hh(cmp1);这样定义出来的hh就是小顶堆,同理我们就可以实现自己的二叉搜索树等等。
比如下面的这个快排就是用传入的函数指针来排序,这样可以升序降序都没问题。、
#include<bits/stdc++.h>
using namespace std;
const int MAXN = ;
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;}///
int single_sort(int l, int r, int num[], PF cmp=cmp1){
int key=num[l];
while(l<r){
while(l<r&&cmp(key,num[r]))
--r;
num[l]=num[r];
while(l<r&&cmp(num[l], key))
++l;
num[r]=num[l];
}
num[l]=key;
return l;
}
void qsort(int l, int r, int num[], PF cmp=cmp1){
if(l+>=r) return;
int k = single_sort(l, r, num, cmp);
qsort(l, k, num, cmp);
qsort(k+, r, num, cmp);
}
int main() {
int num[]={, , , , ,, , , , };
qsort(, , num, cmp2);
for(int i=; i<; ++i){
printf("%d ", num[i]);
}
}
快速排序
同理其他排序也可以做到这样
c++ 函数指针简单实例的更多相关文章
- tf.nn.embedding_lookup TensorFlow embedding_lookup 函数最简单实例
tf.nn.embedding_lookup TensorFlow embedding_lookup 函数最简单实例 #!/usr/bin/env python # -*- coding: utf-8 ...
- C函数指针简单用例
(1)函数指针:可以指向 一类 固定形参类型和返回值类型 的函数 的指针声明:int fun(int, int) || \/int (*pfun)(int, int) pfun就是函数指针 ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
- 成员函数指针与高性能C++委托
1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...
- [转]成员函数指针与高性能的C++委托
原文(作者:Don Clugston):Member Function Pointers and the Fastest Possible C++ Delegates 译文(作者:周翔): 成员函数指 ...
- C/C++函数指针详解(转)
这两天在研究C/C++的函数指针,找到一篇讲解比较详细的博客,内容有点多,但是讲解得比较详细,适合初学者.特转之: 1. 无处不见的函数指针 使用函数指针可以设计出更优雅的程序,比如设计一个集 ...
- 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)
1.函数指针声明的格式及简单的使用 (1)格式:(返回值)(*函数指针名)(参数列表) 例如:声明一个无参数无返回值的函数指针(void)(*p)(void). (2)将函数指针指向某个无参数无 ...
- C/C++中的函数指针
C/C++中的函数指针 一.引子 今天无聊刷了leetcode上的一道题,如下: Median is the middle value in an ordered integer list. If t ...
- 简单计算器的C实现-函数指针,main函数传参
/** 程序功能:简单计算器,实现加减乘除平方* 作者版本日期:2015.11.08 zhouhb OK* 源代码:李明 <新概念C语言培训>第33集 C语言Shell命令解释器的实现* ...
随机推荐
- JAVA每日一旅2
1.关于类型转换 两个数值进行二元操作时,会有如下的转换操作: 如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型. 否则,如果其中一个操作数是float类型,另一个将会 ...
- 第二阶段Sprint9
昨天:重新规划主界面,把视频录制暂放到主页面里 今天:查看有关“共享平台”的资料,看如何实现上传下载功能,并尝试编码, 遇到的问题:看不懂什么意思,照例子做不行,还得需要联网等
- hibernate 创建工厂类
package cn.hibernate; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; / ...
- Answer My Questions
回答自己的问题,真棒!断电让自己的工作重来.真棒! 阅读以前自己的博客,发现问题都已经有了答案. (1).想要成为一名专业的软件工程师,首先得是有相关的资格证书,这个可以通过软考获得.然后在职场中锻炼 ...
- 数学口袋精灵app(小学生四则运算app)开发需求
数学口袋精灵APP,摒除了传统乏味无趣学习数学四则运算的模式,采用游戏的形式,让小朋友在游戏中学习,培养了小朋友对数学的兴趣,让小朋友在游戏中运算能力得到充分提升.快乐学习,成长没烦恼! 项目名字:“ ...
- Zero-shot learning(零样本学习)
一.介绍 在传统的分类模型中,为了解决多分类问题(例如三个类别:猫.狗和猪),就需要提供大量的猫.狗和猪的图片用以模型训练,然后给定一张新的图片,就能判定属于猫.狗或猪的其中哪一类.但是对于之前训练图 ...
- wia驱动扫描仪
.net wia驱动扫描仪 通过各种途径,将当前比较流行的驱动扫描仪封装成了一个简单实用的class,调用扫描仪时,只需要重新创建个对象即可,代码如下: using System;using Syst ...
- spring @component的作用
该文转载自:http://tomfish88.iteye.com/blog/1497557 1.@controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@reposi ...
- JavaScript ES6中export及export default的区别以及import的用法
本文原创地址链接:http://blog.csdn.net/zhou_xiao_cheng/article/details/52759632,未经博主允许不得转载. 相信很多人都使用过export.e ...
- Linux kernel 发布 5.0-rc1 版本
Linux kernel 要发布 5.0 了.. 跟原因是 linus 认为 4.21的小版本号太多了... 邮件内容如下: https://lore.kernel.org/lkml/20190107 ...