从汇编的眼光看C++(之泛型编程)

来源:互联网 发布:java代码防止反编译 编辑:程序博客网 时间:2024/05/01 08:42

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】 


    泛型编程其实不难。本质上说,泛型编程就是让通用的算法应用到所有的数据类型。具体来说,int是我们熟悉的整数类型。那么一般情况下,如果我们写一个int整数的排序算法,应该怎么写呢?大家可以自己试试?下面的代码是我的一个范例;
void bubble_sort(int array[], int length){int temp = 0;int outer = 0;int inner = 0;assert(NULL != array && 0 != length);for(outer = length -1; outer >= 1; outer --){for(inner = 0; inner <= outer; inner ++){if(array[inner] > array[inner + 1]){temp = array[inner];array[inner] = array[inner + 1];array[inner + 1] = temp;}}}return;}
   如果把数据类型改成通用的数据类型,你需要做什么呢?两个:(1)算术符"="重载;(2)比较函数。下面就是一个设计的class类型。
class type{int data;public:type(int value = 0): data(value) {}type(type& t) {data = t.get_data();}~type() {}type& operator=(type& t) {data = t.get_data(); return *this;}int get_data() {return data;}};
    那么,比较函数呢?我们可以用一个全局函数代替。
int type_compare(type& t1, type& t2){return t1.get_data() > t2.get_data() ? 1 : 0;}
    至此所有的函数都已经修改好了,那么bubble_sort的函数也要修改吧,我们看看应该怎么做?
template <typename data>void bubble_sort(data array[], int length, int (*compare)(data& , data& )){data temp;int outer = 0;int inner = 0;assert(NULL != array && 0 != length);for(outer = length -1; outer >= 1; outer --){for(inner = 0; inner <= outer; inner ++){if(compare(array[inner], array[inner+1])){temp = array[inner];array[inner] = array[inner + 1];array[inner + 1] = temp;}}}return;}
    眼看着代码都已经使用好了,那下面应该看看怎么使用了。可以看看下面的代码:
272:      type t[2] = {type(2), type(1)};0040148D   push        20040148F   lea         ecx,[ebp-14h]00401492   call        @ILT+25(type::type) (0040101e)00401497   mov         dword ptr [ebp-4],00040149E   push        1004014A0   lea         ecx,[ebp-10h]004014A3   call        @ILT+25(type::type) (0040101e)004014A8   mov         byte ptr [ebp-4],1273:      bubble_sort<type> (t, 2, type_compare);004014AC   push        offset @ILT+20(type_compare) (00401019)004014B1   push        2004014B3   lea         eax,[ebp-14h]004014B6   push        eax004014B7   call        @ILT+50(bubble_sort) (00401037)004014BC   add         esp,0Ch274:      return;004014BF   mov         byte ptr [ebp-4],0004014C3   lea         ecx,[ebp-10h]004014C6   call        @ILT+5(type::~type) (0040100a)004014CB   mov         dword ptr [ebp-4],0FFFFFFFFh004014D2   lea         ecx,[ebp-14h]004014D5   call        @ILT+5(type::~type) (0040100a)275:  }
    我们看到了,简单的排序已经完成了,函数最终会调用bubble_sort函数。泛型虽然复杂,涉及到了函数指针、算术符重载、模板函数等知识,但是只要勇于尝试,就会使用越来越方便,越来越顺手。


问题:
    (1) 大家可以尝试编写一个insert_sort的泛型函数?
    (2)尝试编写一个二分法的泛型处理函数?
    (3)尝试编写一个quick_sort的泛型函数,可能考虑的因素需要多一些?不过也可以尝试一下哦。


【预告: 下面的博客会写一些 关于class技巧的文章】

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 缝的线长在肉里怎么办 小孩喜欢用舌头顶牙齿缝怎么办 1岁多小宝贝全身长红点怎么办 生完胸好涨但很难把奶吸出来怎么办 怀孕快9个月内裤上有白带怎么办 一早起来发现内裤有白色液体怎么办 阴部骚痒白带多白带多小腹痛怎么办 15岁一周鲁了3次怎么办 月经摊迟三天内裤有白带怎么办 怀孕内裤上有黄黄的分泌物怎么办 老公出轨想离婚但舍不得孩子怎么办 老婆出轨离婚又舍不得家我该怎么办 怀孕一个月刚刚自慰有点流血怎么办 老公出轨还不知道悔改妻子怎么办 离婚了前妻户口还在再婚怎么办 怀孕六个月内裤老是湿有异味怎么办 怀孕五个月内裤总是湿有异味怎么办 耳朵里面有个洞老是流水冒浓怎么办 宝宝拉粑粑有臭酸味怎么回事怎么办 老婆晚上回家内裤是湿的尿味怎么办 怀孕五个月下身痒内裤湿怎么办 哺乳期奶水太多经常弄湿衣服怎么办 麻料裙子一坐下就皱怎么办 不小心把答题卡弄皱了怎么办 嘴巴又干又黏又臭怎么办 不小心把红枣核吞了怎么办 小天才电话手表被偷了怎么办 18k金被火烧黑了怎么办 衣服掉色染到别的衣服上怎么办 夏天太阳太毒刚发芽的花种子怎么办 长斑了怎么办 喝玫瑰花茶能祛斑吗 烧纸火纸迷信纸利润太低怎么办 刚买的绣球花花有点蔫怎么办 ZF葡7正常佩戴动能太满怎么办 怀孕初期老婆婆做的菜不好吃怎么办 调节协议已签字不签收调解书怎么办 给晋中苗圃拉了树苗没拿上钱怎么办 多肉旁边长出好多小株怎么办 烤瓷牙制备时颌关系不够怎么办 对门放石头正对我家大门怎么办 合租的室友关门开门特别大声怎么办