下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、c+仿函数的应用问题描述: suct strecorditem char szname_max_name_len_; /物品名称 int dwbaseid; /基本id int btitemlvl; /品阶 int ount; /数量 _int64 i64time; /记录这条信息的时光,假如有叠加的,按后一个的时光 ; list strecorditem listrecorditem; 现在要根据 ncount 降序,在 ncount 相同的时候,按btitemlvl的降序罗列。 解决办法: struct bool operator()(const strecorditem st1,cons
2、t strecorditem st2 ) if(st1.ncount st2.ncount) return fae; else if(st1.ncount = st2.ncount) if(st1.btitemlvl st2.btitemlvl) return false; else return true; else return true; listrecorditem.(cmp(); 不言而喻,排序算法的简洁性与可扩展性都十分好。这个办法就是用法了stl常用的一种办法:仿函数 仿函数的概念: 仿函数(functor),就是使一个类的用法看上去象一个函数。其实现就是类中实现一个operat
3、or(),这个类就有了类 函数的行为,就是一个仿函数类了。 有一个比较好的例子,实现了huffman 编码与解码的程序,摘录如下: 用法 c 在 editplus 中编写一个 huffman 编码与解码的程序,碰到了需要对一个文件中的全部字符举行权重计算以创建每个字符的终于编码的过程,这其中有一个步骤是需要遍历已有的字符权重表以查找当前从文件中取得的字符是否已经存在于该表中,假如存在就将该表中的该字符权重加一,如不存在则需要新建一个存储 node 以存储该字符,并将该 node 结构添加到已有的权重表中。 考虑到需要在权重表中举行字符查找以及之后创建 huffman tree 时可能需要对该表
4、各项举行排序所以选用 vector node 作为存储容器,查找及排序可以用法 algorithm 头文件当中的 sort 和 算法。 huffman.h include iostream include fstream include string include vector include algorithm /for find_if func; include functional /for bind2nd func; using namespace std; class huffman public: huffman(vo); void encode(const string );
5、void decode(const string file, const string srctable) const; huffman(); private: /table node typef struct char letter; int level; int parent; int direction;/-1 for no parent, 0 for left, 1 right; node; vector node nodetable;/can be sorted; /仿函数,用于find_if,侦测字符是否已经存在; /template typename t1, typename t
6、2 class comparer : public binary_function node, char, bool public: comparer(const char ch):_ch(ch); const bool operator()(const vector node :value_type node, char ch) const return node.letter = ch; private: char _ch; huffman.p include huffman.h huffman:huffman(void) /mmany; void huffman:encode(const
7、 string file) ifstream fin; fin.open(file.c_str(); char ch; while(fin.get(ch) if (nodetable.size() != 0) /vector node :iterator relt = find_if(nodetable.begin(),nodetable.end(),compare(ch); /仿函数 vector node :iterator result = find_if(nodetable.begin(),nodetable.end(),bind2nd(comparer(ch), ch); /lamb
8、da 函数方式; /vector node :iterator result = find_if(nodetable.begin(),nodetable.end(),(const node node)- boolreturn node.letter = ch;); if (result = nodetable.end() node* node = new node; node- letter = ch; node- level = 1; node- parent = 0; node- direction = -1; else result- level += 1; else node* nod
9、e = new node; node- letter = ch; node- level = 1; node- parent = 0; node- direction = -1; fin.close(); /huffman ; void huffman:decode(const string file, const string srctable) const /dummany; huffman:huffman(void) /dummany; 解释: 1、仿函数不是函数,而是一个类,这个类重载了()操作符; 2、仿函数调用过程是这样的:find_if(nodetable.begin(), no
10、detable.end(), comparer(ch) 中 comparer(ch)只是创建了 comparer 类的匿名办法,重载的 operator() 真正的调用是在 接下来将要看到的 find_if 模板函数的这一句 pred(*first); 3、代码中不用法 find 而用法 find_if 是由于需要举行查找的不是 prime type 而是自行编写的符合 类型,find_if 的函数原型参考如下,从原型中可以看到第一个参数是以默认的方式举行的: template class inputiterator, class predie inputiterator find_if (
11、inputiterator first, inputiterator last, predicate pred ) for ( ; first!=last ; first+ ) if ( pred(*first) ) break; return first; 4、bind2nd 函数的作用是将 二元算子(binary functor, bf) 转化为一元算子(unary functor,uf)还有一个类 的bind1st, 用法时需要包含functional头文件; 5、举行比较的仿函数需要继承 binary_functor typename t1,typename t2,typename t3 ,原型如下: template class arg1, class arg2, class result struct binary_function typedef arg1 first_argument_type; typedef arg2 second_argument_type; typedef resul
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 长春人文学院《教育的哲学与社会学基础》2026-2027学年第一学期期末试卷含解析
- 武汉大学《建筑信息模型基础》2026-2027学年第一学期期末试卷含解析
- 中国地质大学(武汉)《报关与报检实务》2026-2027学年第一学期期末试卷含解析
- 四川文轩职业学院《汽车专业英语》2026-2027学年第一学期期末试卷含解析
- 中山大学《公路工程估价》2026-2027学年第一学期期末试卷含解析
- 上饶师范学院《甲壳动物增养殖学A》2026-2027学年第一学期期末试卷含解析
- 中国医科大学《建设工程计价》2026-2027学年第一学期期末试卷含解析
- 长沙卫生职业学院《大学生职业发展与就业指导I》2026-2027学年第一学期期末试卷含解析
- 绿色科技:打造可持续未来-政府与科技携手推动环保进步
- 自主学习成就卓越-教师引领学生主动成长
- 2025江苏苏州市健康养老产业发展集团有限公司下属子企业招聘4人(第五批)笔试历年备考题库附带答案详解试卷2套
- 要素式申请执行文书-强制执行申请书模版
- 台球厅员工手册
- (2025年)自贡事业编面试真题及答案
- 2025-2030中国重症监护医院资源配置与运营优化报告
- 2025年福建省省级机关遴选公务员考试真题及答案解析
- 个人收入及纳税证明模板标准版
- 风电场安全知识培训
- 吉林省长春市2025年外研版(一起)六年级下册毕业质量监测英语试卷(含答案)
- 2025年河北廊坊三河市人民医院招聘28人考试参考试题及答案解析
- 2025年山东省潍坊市中考英语真题(解析版)
评论
0/150
提交评论