程序设计范式二
•
不同的数据类型,用
同样的
memcmp
实现比较,对于较为复杂的数据结构,如数组、结构体等会失去通用性。
•
每种数据类型,其数据比较方式可能会不同。例如,两个整数比较,两数相减,看结果是
0
还是正负数就可以比较其大小。两个字符串的比较,则可用
strcmp
进行比较。
•
通用搜索函数的解决方案之一是再增加一个参数,用于传入特定数据类型的比较函数。函数原型:
void* search( void* a, void* k, int n , int m,
int (*compare)(void *, void *) );
•
compare
是一个指向某函数的指针。
•
compare
所指向的函数是一个比较函数,带两个
void *
参数(表示不知道要比较的数据类型是什么),返回一个整型数据(用于判断两个数值的大小)。
#include<iostream>
#include <cstring>
void* search(void* a,void* k,int n,int m,int (*compare)(void *,void*)){
for(int i=0;i<n;i++){
void* addr=(char *)a+i*m;
if(compare(addr,k)==0)
return addr;
}
return NULL;
}
int cmp_int(void* x,void* y){
int* p1=(int *)x;
int* p2=(int *)y;
return *p1-*p2;
}
int cmp_string(void* x,void* y){
char* p1=*(char**)x;
char* p2=*(char**)y;
return strcmp(p1,p2);
}
int main(){
int arr[]={36,72,1,83,6,87,10,19};
int len=8;
int key=87;
int *ret=(int *)search(arr,&key,len,sizeof(int),cmp_int);
std::cout <<ret<< ": " << *ret << std::endl;
char* books[]={"水浒传","三国演义","西游记","红楼梦"};
char* book="西游记";
char** ret1=(char **)search(books,&book,4,sizeof(char *),cmp_string);
std::cout <<ret1<< ": " << *ret1 << std::endl;
}