03 2012 档案

摘要:泛型算法的设计(2)前言: 前面我们讨论了一个泛型算法的实现思想,即设计一个算法,使其独立于所操作的容器,并且独立于所操作的元素类型,并分别用不同的机制实现了这两个目的,下面我们在算法设计中引入函数对象,实现算法独立于对元素的底层操作方式,这样我们实现了终极意义上的泛化,下面我们一步步的实现一个真正意义上的泛型算法。1.首先我们写一个函数,它可以找到vector内小于10的所有元素;vector<int> less_than_10(const vector<int> &vec){ vector<int> nvec; for(int ix=0; ix! 阅读全文
posted @ 2012-03-31 17:29 liuhao2638 阅读(249) 评论(0) 推荐(0)
摘要:函数对象(Function Objects)前言: 在前面讨论函数的弹性设计时,我们介绍了通过函数指针的方式来扩展函数的弹性,在此,基于同样的目的我们引入函数对象这个概念。1.定义: 函数对象顾名思义,是行为类似函数的对象;class absInt{ int operator() (int val){ return val<0 ? -val:val; }} 像世间万物一样,函数对象有共性也有个性,所有函数对象的共性是,都重载了调用操作符(如上所示),其个性是不同的函数对象定义了执行不同操作的调用操作符,如plus重载了执行+操作符的调用操作符,equal_to重载了执行==的调用操作符, 阅读全文
posted @ 2012-03-31 11:27 liuhao2638 阅读(446) 评论(0) 推荐(0)
摘要:泛型算法的设计(1)前言:泛型算法独立于操作的容器且与要操作的元素类型无关,达到了函数弹性设计的最大化,下面我们一步步的实现一个泛型算法;1.有一天,老板交给你一个任务,要你编程完成如下工作,给定一个存储整数的vector,及一个整数,如果此值存在于vector内,我们必须返回一个指针指向该值;反之则返回0,表示此值不在vector内;int find(const vector<int> &vec, int value){ for(int ix=0;ix!=vec.size(); ++ix) if(vec[ix]==value) return &vec[ix]; r 阅读全文
posted @ 2012-03-29 21:21 liuhao2638 阅读(235) 评论(0) 推荐(0)
摘要:函数的弹性设计前言: 实现函数的泛化及功能的弹性收缩是代码重用的技术基础也是编程人员应该有的编程思想,C++在语言范畴上也有很多支持其的机制。我们初窥编程时,当针对一个数据进行特定处理时,我们根据处理的流程在main函数的相应位置添相应的处理,当下一次需要对一个相同类型的另一数据处理时,我们在相应的置添加同样的代码用于处理,随着处理次数的增加,我们选择将这个功能抽象出来,这样我们就可以设计出一个对特定数据实现特定操作的函数,用于调用,从使代码更简洁,更易于理解。 随着程序设计的深入,我们常常面对例如对另一种数据类型进行相同的处理或对多种数据进行类似的处理,我们也希望将此类问题抽象出来实现进一步 阅读全文
posted @ 2012-03-27 16:04 liuhao2638 阅读(450) 评论(0) 推荐(0)
摘要:设置默认形参增加函数的弹性函数1:void display(const vector<int> &ivec){for(int ix=0;ix!=ivec.size();++ix)cout<<ivec[ix]<<" ";}分析:此函数非常霸道的将输出绑定到cout对象上,只能输出到屏幕上;改进:通过给函数添加ostream参数,可选择输出到屏幕上还是文件中,设置其默认值为cout,表明默认输出至屏幕上;void display(const vector<int> &ivec,ostream &os=cou 阅读全文
posted @ 2012-03-26 03:13 liuhao2638 阅读(248) 评论(0) 推荐(0)
摘要:动态内存管理1.堆内存(heap memory):程序自由空间,此种内存必须由程序员自行管理,其配置有new表达式达成,释放有delete表达式完成;2.配置heap内存的方式: int *pi=new int(1024); int *pia=new int[24]; 注: C++中没有提供任何语法让我们得以从heap配置数组的同时为其元素设定初值;3.heap配置而来的对象,皆是未经过初始化的;4.heap配置而来的对象执行期通过new配置而来,直到以delete表达式加以释放为止(heap 配置对象的生存期);5.delete 释放heap配置的内存时,无需检验pi是否为零,编译器会自动为 阅读全文
posted @ 2012-03-26 02:34 liuhao2638 阅读(682) 评论(0) 推荐(1)
摘要:参数以引用参数传递和以指针形式传递效果相同;差异是:指针可能不指向某一实际对象,当我们提领指针时,一定要先确定其值并非为0;而引用必定会代表某个确定的对象,所以不须做此检查;故综合比较指针参数和引用参数 引用参数的更有优势,因为引用参数不需要检查,而使用指针参数时需要检查是否指向某一确定的对象;总结:1.将参数声明为引用的理由之一是,希望直接对所传入的对象进行修改2.将参数声明为引用的理由之二是,降低复制大型对象的负担3.传址方式主要应用于类类型之上,当传递内建类型时,不要使用传址方式 阅读全文
posted @ 2012-03-26 01:44 liuhao2638 阅读(1697) 评论(0) 推荐(0)
摘要:文件的读写操作1.开启一个可供输出的文件 ofstream outfile("filename"); 如果指定的文件存在,这个文件会被开启为输出之用,而文件中原已存在的数 据会被丢失; 如果指定的文件不存在,便会有一个文件被产生出来并开启为输出之用; 如果文件已经存在,并且我们不希望丢弃原有内容,而是希望增加新数据到文 件中,那么我们以追加模式(append mode)开启这个文件,提供第二个参数 ios_base::app ofstream outfile("filename",ios_base::app); 文件开启有可能失败,在进行写入操作之前,我 阅读全文
posted @ 2012-03-26 00:59 liuhao2638 阅读(258) 评论(0) 推荐(0)
摘要:一个健壮的Fibonacci数列函数的实现函数功能:返回Fibonacci数列中的指定位置的元素;1.基本函数的实现代码如下:int fibon_elem(int position){ int elem=1; int n_1=1,n_2=1; for(int ix=3;ix<=position;++ix) { elem=n_1+n_2; n_1=n_2; n_2=elem; } return elem;}分析:函数满足了我们基本的功能,但实际上我们做了两个不合理的假设;1).假设用户不会犯错,输入的均为合理的位置,不会出现输入零值或负值的情况2).该位置上的数在int型整数的范围之内实际 阅读全文
posted @ 2012-03-25 23:47 liuhao2638 阅读(258) 评论(0) 推荐(0)
摘要:一个简单的猜数字游戏设计与实现(2)前言:敏捷编程的设计思想是:先让它跑起来,然后在其内添加功能;在前一篇文章中简单实现了猜测判断和流程控制,但只能对一种Fabonacci数列进行猜测,掌握规律后未免单调,故希望游戏扩展如下功能:有六种数列:Fibonacci,Lucas,Pell,Triangular,Square,Pentagonal;每种数列的数字排列有不同的规律,随机出现其中的一种数列的前两个数字;用户猜测第三个数字;1.设计思想:用六个vector<int>分别存放6种数列的连续三个数字,用一个指针数组存储指向六个vector的指针,随机产生一个数组下标,从而可以随机的指 阅读全文
posted @ 2012-03-25 16:35 liuhao2638 阅读(877) 评论(0) 推荐(1)
摘要:一个简单的猜数字游戏的实现(一)前言:这几天看Essential C++, 第一章Stanley B.Lippman用C++实现了一个猜数字的小游戏,细细体会,程序虽小,但五脏俱全,一个完整的程序设计思路,变量命名,小的语法细节及指针带来的弹性设计,细细揣摩受益颇多,在这里把程序的设计过程和夹杂着自己的思路整理一下,也感谢侯捷老师细致的翻译。1.功能需求分析:游戏功能:给出Fibonacci数列的前两个数字,用户猜测第三个数字;注:我们往往从用户那里得到一个较为模糊的需求,软件功能的概括描述,或游戏功能的简单概括,而我们在用计算机实现时需要得到一个细致的需求分析,通过从计算机的角度思考及和用户 阅读全文
posted @ 2012-03-25 15:17 liuhao2638 阅读(1763) 评论(2) 推荐(2)
摘要:前言:生成随机数是程序中经常要实现的一个小功能模块,其生成方法是程序员的必备基本功;这里将有关生成随机数有关的函数及生成的思路简单总结。正文:1.rand()函数:原型:int rand();头文件:#include<cstdlib>返回值:返回一随机数,范围在0至RAND_MAX之间,其中RAND_MAX定义在stdlib.h中;技巧:可通过求余运算调整返回随机数的范围,例如rand()%10 则返回0到9之间的随机数。生成随机数程序:#include <iostream>#include <cstdlib>using namespace std;void 阅读全文
posted @ 2012-03-25 12:00 liuhao2638 阅读(290) 评论(0) 推荐(0)