码迷,mamicode.com
首页 > 其他好文 > 详细

用 void* 编写泛型函数

时间:2015-03-06 23:39:26      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:

1.泛型交换

//1.编写int类型的swap
void swap(int *vp1, int *vp2) {
    int a = *vp1;
    *vp1 = *vp2;
    *vp2 = *vp1;
}
//2.引申至泛型swap
void swap(void *vp1, void *vp2, int size){
    char buffer[size];
    memcpy(buffer, vp1, size);
    memcpy(vp1, vp2, size);
    memcpy(vp2, buffer, size);
}

使用泛型swap交换C-string:

char* husband = "Fred";
char* wife = "Wilma";
swap(&husband,&wife,sizeof(char));

 

2.泛型线性搜索

//1.编写int类型的lsearch
int * lsearch(int key ,int* array, int size){
    for (int i = 0; i < size; i++)  
    {
        if(array[i] == key)
            return i;
    }
    return NULL;
}
//2.编写泛型lsearch
int *lsearch(void *key, void *base, int size, int elementSize){
    for (int i = 0; i < size; i++) {
      void * elemAddr = (char *)base + i * elemSize; 
      if (memcmp(key, elemAddr, elemSize) == 0)
        return elemAddr;
    }       
    return NULL;
}

如果用泛型lsearch来搜索C-string,因为C-string的长度不是固定的,故无法利用memcmp进行比较。可以利用函数指针实现:

int *lsearch(void *key, void *base, int size, int elementSize,int (*cmpFunc)(void *,void *)){
    for (int i = 0; i < size; i++) {
      void * elemAddr = (char *)base + i * elemSize; 
      if (cmpFunc(key, elemAddr) == 0)
        return elemAddr;
    }       
    return NULL;
}

实现cmpFunc:

//比较int
int intCmp(void *elem1,void *elem2){
    int *ip1 = elem1;
    int *ip2 = elelm2;
    return *ip1-*ip2;
}
//比较C-string
int strCmp(void *elem1,void *elem2){
    char *s1 = *(char**)elem1;
    char *s2 = *(char**)elem2;
    return strcmp(s1,s2);
}

 

用 void* 编写泛型函数

标签:

原文地址:http://www.cnblogs.com/bukekangli/p/4319486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!