代码复用学习实例
来源:互联网 发布:金庸新修 知乎 编辑:程序博客网 时间:2024/06/07 12:35
本例子为一道面试题的归纳总结,题意为调整数组顺序是的奇数位于偶数前面。
这是一类问题,我们在写代码的时候,要考虑扩展性,如果将题意改为将数组中能被3整除的数调整到不能被3整除的数后面,比如将数组中正整数调整到负数后面之类的一系列问题都可以用一个模式解决,而不用重新写很多重复代码。
如下为3种代码写法,第一种为原始写法,不考虑扩展性。第二种为函数指针写法,第三种使用了函数对象的写法。
/* * author:janestar* email:janestar@163.com*/#include<iostream>#include<vector>using namespace std;//原始写法,不考虑代码复用void reOrderArray(vector<int> &array){size_t size = array.size();if (size == 0)return;typedef vector<int>::iterator it;it pbegin = array.begin();it pend = array.end()-1;while (pbegin < pend){ //向后移动pbegin,直到指向偶数while (pbegin < pend&&((*pbegin)&0x1) != 0)pbegin++;//向前移动pend,知道指向奇数while (pbegin < pend && ((*pend)&0x1) == 0)pend--;if (pbegin < pend){int tmp = *pbegin;*pbegin = *pend;*pend = tmp;}}}//定义函数指针typedef bool(*Fun)(int n);bool judge_is_odd(int n){if (n & 0x1 == 0)return false;else return true;}//利用函数指针解耦合void reOrderArray2(vector<int> &array,Fun fun){size_t size = array.size();if (size == 0)return;typedef vector<int>::iterator it;it pbegin = array.begin();it pend = array.end() - 1;while (pbegin < pend){//向后移动pbegin,直到指向偶数while (pbegin < pend &&fun(*pbegin))pbegin++;//向前移动pend,知道指向奇数while (pbegin < pend && !fun(*pbegin))pend--;if (pbegin < pend){int tmp = *pbegin;*pbegin = *pend;*pend = tmp;}}}//利用function object 解耦合struct judge_is_odd_struct{bool operator()(int val){if (val & 0x1 == 0)return false;else return true;}};void reOrderArray3(vector<int> &array, judge_is_odd_struct j){size_t size = array.size();if (size == 0)return;typedef vector<int>::iterator it;it pbegin = array.begin();it pend = array.end() - 1;while (pbegin < pend){//向后移动pbegin,直到指向偶数while (pbegin < pend &&j(*pbegin))pbegin++;//向前移动pend,知道指向奇数while (pbegin < pend && !j(*pend))pend--;if (pbegin < pend){int tmp = *pbegin;*pbegin = *pend;*pend = tmp;}}}int main(){int data[] = { 1, 3, 3, 4, 5, 6, 8 };vector<int>num(data,data+sizeof(data)/sizeof(int));//reOrderArray(num);//reOrderArray2(num, judge_is_odd);judge_is_odd_struct s;reOrderArray3(num, s);for (auto x : num){cout << x << " ";}cout << endl;system("pause");return 0;}
0 0
- 代码复用学习实例
- PHPUnit 学习实例代码
- Redis学习手册(实例代码)
- Redis学习手册(实例代码)
- Redis学习手册(实例代码)
- Redis学习手册(实例代码)
- iOS: 学习笔记, 用代码驱动自动布局实例
- iOS: 学习笔记, 用代码驱动自动布局实例(swift)
- Python实现端口复用实例代码
- 实例-简单设计&精简代码&复用代码
- 基础学习笔记 + 代码实例 (1)
- 基础学习笔记 + 代码实例 (2)
- 基础学习笔记 + 代码实例 (3)
- PL/SQL学习代码实例1
- C++初级学习的一些实例代码
- JS学习2. 简单的实例代码
- SQLite学习手册实例代码<一>
- SQLite学习手册(实例代码<一>)
- java中JoptionPane类的使用
- 关于 @synchronized,这儿比你想知道的还要多
- 安装了乌班图,win10下安装百度云时提示已经安装???
- Java大牛养成记(7)——后台权限拦截器
- VS2013,fatal error C1071: unexpected end of file found in comment
- 代码复用学习实例
- 解决git本地多ssh key的问题
- ftrace kprobe调试
- MATLAB中的点运算
- FPGA约束文件
- Binder学习笔记(九)—— 服务端如何响应Test()请求 ?
- 传统定时器技术
- 深度遍历和广度遍历,邻接表和邻接矩阵
- 大二了,用csdn也有好几个年头了,也该开始开始记录整理一些生活中的资料了,说不定什么时候就成大牛了。哇咔咔