您的位置:首页 > 其它

再议指针---------函数回调(qsort函数原理)

2015-02-26 11:44 162 查看
  
  我们是否能写一个这种函数:
  能够对不论什么类型数据排序
  不论什么人在使用该函数不须要改动该函数代码(即:用户能够不必看到函数源		 码,仅仅会调用即可)
  思考:
  用户须要排序的数据的类型千变万化,可能是int型,也有可能是自己定义的结构体类型,各种类型的大小比較规则是不一样的,这样看来实现一个这样全能的排序函数似乎不可能。
  但详细须要排序的类型应依照什么规则确定大小仅仅有使用该函数的用户最清楚,那我们可不能够把实现比較大小的功能交给用户来完毕了,到时候用户仅仅需告诉该函数比較规则(函数)在什么位置,这样排序函数不就能够知道数据大小的比較规则了嘛!排序功能也就能够实现了。
  
  
  
  那详细应该如何实现这个函数呢?
  我们知道函数是有地址的,仅仅要让用户把大小比較规则写到一个独立的函数中,然后把该函数的地址传给排序函数就能够了。
  
  以下的compare变量就是用来接收用户定义的大小比較规则函数地址
  //如果须要排序的数据放在了int型数组中
  int sort(int* arr,int (*  compare)(const void* a,const void* b))
  {
int result = compare(arr,arr+1);//调用用户定义的大小比較函数得到谁大谁小

  //.....详细排序过程省略...........//
  }
  
  用户仅仅须要写一个这种函数就能够了
  int comp(const void* a,const void* b)
  {
  //先强制转换类型,此处如果须要比較的数据类型为int型,当然须要比較结构体	//大小时要先转换成相应的结构体类型,然后再依据结构体中某些变量确定谁大谁	//小
  	int* aa=(int*)a;
  	int * bb=(int*)b;
  	return *aa>*bb?1:-1;
  }
  
  
  然后用户调用
  sort(arr,comp);就能够了//如果须要排序的数据放在了int型arr数组中
  
  到如今为止,我们已经实现了这个全能的排序函数,事实上c++库中的qsort就是这样实现的,不光是c++,事实上java也有相似的实现方式,比方java中加入监听器时常常要传入一个对象,事实上是为了得到这个对象的引用,然后调用我们实现的对象中的方法(通过多态实现)(详细事例详见本博客排列组合java源码及jar包  http://blog.csdn.net/qingchunweiliang/article/details/26464479)   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: