下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025湖南省建筑安全员-C证考试(专职安全员)题库及答案
- 贵阳学院《市场营销调研》2023-2024学年第一学期期末试卷
- 贵阳康养职业大学《电力系统自动化装置》2023-2024学年第一学期期末试卷
- 广州幼儿师范高等专科学校《英语国家社会与文化(一)》2023-2024学年第一学期期末试卷
- 2025年河北建筑安全员B证考试题库附答案
- 2025青海省建筑安全员-A证考试题库及答案
- 广州医科大学《传统建筑保护与更新》2023-2024学年第一学期期末试卷
- 广州现代信息工程职业技术学院《公共安全与应急管理》2023-2024学年第一学期期末试卷
- 2025年上海建筑安全员-B证考试题库及答案
- 2025湖北建筑安全员知识题库
- PAS 2050:2011-商品和服务在生命周期内的温室气体排放评价规范(英文)
- 历史期中复习课件八年级上册复习课件(统编版)
- 空调供货方案
- 2024年初一英语阅读理解专项练习及答案
- 幕墙作业安全技术交底
- 保护性约束完整版本
- 埃森哲流程制造-智能工厂规划设计相关两份资料
- 国家开放大学电大《供应链管理》期末题库及答案
- 10万吨绿色航空煤油项目可行性研究报告写作模板-备案审批
- 物业服务水电维修方案
- 光伏车棚施工方案
评论
0/150
提交评论