【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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        2
0040148F   lea         ecx,[ebp-14h]
00401492   call        @ILT+25(type::type) (0040101e)
00401497   mov         dword ptr [ebp-4],0
0040149E   push        1
004014A0   lea         ecx,[ebp-10h]
004014A3   call        @ILT+25(type::type) (0040101e)
004014A8   mov         byte ptr [ebp-4],1
273:      bubble_sort<type> (t, 2, type_compare);
004014AC   push        offset @ILT+20(type_compare) (00401019)
004014B1   push        2
004014B3   lea         eax,[ebp-14h]
004014B6   push        eax
004014B7   call        @ILT+50(bubble_sort) (00401037)
004014BC   add         esp,0Ch
274:      return;
004014BF   mov         byte ptr [ebp-4],0
004014C3   lea         ecx,[ebp-10h]
004014C6   call        @ILT+5(type::~type) (0040100a)
004014CB   mov         dword ptr [ebp-4],0FFFFFFFFh
004014D2   lea         ecx,[ebp-14h]
004014D5   call        @ILT+5(type::~type) (0040100a)
275:  }

我们看到了,简单的排序已经完成了,函数最终会调用bubble_sort函数。泛型虽然复杂,涉及到了函数指针、算术符重载、模板函数等知识,但是只要勇于尝试,就会使用越来越方便,越来越顺手。

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

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

从汇编的眼光看C++(之泛型编程)相关推荐

  1. 用汇编的眼光看C++(之 总结篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 早在八月份的时候,就陆陆续续写了二十多篇用汇编语言看C++的博客内容.在此为了做一个概括,也为 ...

  2. 用汇编的眼光看C++(之退出流程)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 无论是在判断还是在循环的过程中,通常在遇到合适的条件的时候就会退出相应的模块.跳出模块运行的方 ...

  3. 用汇编的眼光看C++ (之x86汇编)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 说到用汇编的眼光看C++语言,那么怎么阅读汇编代码就成了我们需要解决的一个问题.其实,实话说, ...

  4. 用汇编的眼光看C++(之判断流程)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在我们平常的编程当中,用于判断的地方很多,但主要有下面三种方式:if-else:switch: ...

  5. 用汇编的眼光看C++(之拷贝、赋值函数)

    拷贝构造函数和复制函数是类里面比较重要的两个函数.两者有什么区别呢?其实也很简单,我们可以举个例子,加入有这样一个类的定义: [cpp] view plaincopy class apple { pu ...

  6. 用汇编的眼光看C++(之算术符重载陷阱)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在算术符重载里面,"="重载可能是最经常使用的一种.但是好多人就误以为在函 ...

  7. 从汇编的眼光看C++(之指针拷贝)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此.特别是在C++中,如果 ...

  8. 从汇编的眼光看C++(之递归函数与模板类)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 递归,相信有过基本C语言经验的朋友都明白,就是函数自己调用自己.所以,本质上说,它和普通的函数 ...

  9. 用汇编的眼光看C++(之模板类)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 如果类是一种确定的数据类型,那么模板就是一种对类的抽象.假设有这么一种类,它需要进行数据的计算 ...

最新文章

  1. “CAIL 2021中国法律智能技术评测”全面开启!
  2. 动易html编辑器,文章内容一键排版功能——动易5.1版新特性
  3. bookstrap 怎么用ajax,bootstrap里怎么用ajax请求数据到table里
  4. arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别
  5. 开源项目成熟度分析工具-利用github api获取代码库的信息
  6. 中国科技大学校长朱清时:我的两次“错误”选择
  7. 丑憨批的NLP笔记BERT前置:ATUO encoder,DAE
  8. 【大话设计模式】设计模式系统学习大合集
  9. 第一章:NHibernate的简介
  10. 使用yield返回IEnumberT集合
  11. python可以用来写什么_对于一个OIer,Python能干些什么?
  12. Win7服务器搭建实例教程:教你Win7如何搭建Web服务器【转载】
  13. 阿里巴巴java开发手册pdf
  14. 大学生计算机应用大赛广告设计,计算机应用工程系第四届“经纬在线杯”网页广告设计大赛圆满结束...
  15. chrome控制台如何把vw显示成px_Python + selenium + Chrome 模拟登陆QQ邮箱,批量下载附件,本地重命名
  16. 【专家级前端JavaScript面试题】快来尝试一下
  17. word文档图片画红线_在Word中巧妙绘制漂亮分割线的方法
  18. 题目:A派生出子类B,B派生出子类C,并且在Java源代码中有如下声明,问以下哪个说法是正确的?()
  19. 什么是Google广告:AdSence令数多人致富
  20. 计算机表格中如何计算数据透视表,Excel中如何在数据透视表中进行计算

热门文章

  1. windows ad 域下配置L2TP ***服务器 企业防火墙端口配置
  2. 自动化运维工具Ansible之roles
  3. 怎么样做好手机网站的优化和推广呢?
  4. jquery二级联动select
  5. hdu1243 dp (类最长公共子序列)
  6. 支持向量机(SVM)-文本分类 (1)
  7. Java后台通过jxl生成Excel表格
  8. GeoServer+PostgreSQL+PostGIS+pgRouting实现最短路径查询
  9. 记录webpack commonJs 加载文件规则
  10. jaxp与dom4j遍历xml树