函数指针的用途
1、给结构体排序
// 函数指针的用途。譬如:给结构体排序 struct User { const char* name; int numb; }; typedef int CFT (const void*, const void*);// 函数指针类型的定义 void ssort(void* base, int n, int sz, CFT comp) /* 对向量base的元素进行递增排序 n是base的元素个数 sz是元素的大小,即sizeof(base[0]) comp是比较函数 shell排序 */ { for(int gap = n/2; gap>0; gap /= 2) { for(int i=gap; i<n; ++i) { for(int j=i-gap; 0<=j; j-=gap) { char* b = static_cast<char*>(base);// 必须强制转换 char* pj = b + j*sz; // &base[j] char* pjg = b + (j+gap)*sz; // &base[j+gap] if(comp(pjg,pj)<0) //若 base[j+gap] < base[j]; 则交换两者 { for(int k=0; k<sz; ++k) { char temp = pj[k]; pj[k] = pjg[k]; pjg[k] = temp; } } } } } } int comp1(const void* p,const void* q) // 比较name { return strcmp(static_cast<const User*>(p)->name, static_cast<const User*>(q)->name); } int comp2(const void* p,const void* q) // 比较numb { return static_cast<const User*>(p)->numb - static_cast<const User*>(q)->numb; } int main() { User v[] = { "wang", 100, "Lee", 101, "lee", 102, "allen", 99, }; ssort(v,sizeof(v)/sizeof(v[0]),sizeof(v[0]),comp1); for(size_t i=0; i<sizeof(v)/sizeof(v[0]); ++i) { cout << v[i].name << " " << v[i].numb << endl; } cout << "-----------------\n"; ssort(v,sizeof(v)/sizeof(v[0]),sizeof(v[0]),comp2); for(size_t i=0; i<sizeof(v)/sizeof(v[0]); ++i) { cout << v[i].name << " " << v[i].numb << endl; } return 0; }
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。