c++仿函數(shù)的應用_第1頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、c+仿函數(shù)的應用問題描述: suct strecorditem char szname_max_name_len_; /物品名稱 int dwbaseid; /基本id int btitemlvl; /品階 int ount; /數(shù)量 _int64 i64time; /記錄這條信息的時光,假如有疊加的,按后一個的時光 ; list strecorditem listrecorditem; 現(xiàn)在要根據(jù) 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常用的一種辦法:仿函數(shù) 仿函數(shù)的概念: 仿函數(shù)(functor),就是使一個類的用法看上去象一個函數(shù)。其實現(xiàn)就是類中實現(xiàn)一個operat

3、or(),這個類就有了類 函數(shù)的行為,就是一個仿函數(shù)類了。 有一個比較好的例子,實現(xiàn)了huffman 編碼與解碼的程序,摘錄如下: 用法 c 在 editplus 中編寫一個 huffman 編碼與解碼的程序,碰到了需要對一個文件中的全部字符舉行權重計算以創(chuàng)建每個字符的終于編碼的過程,這其中有一個步驟是需要遍歷已有的字符權重表以查找當前從文件中取得的字符是否已經(jīng)存在于該表中,假如存在就將該表中的該字符權重加一,如不存在則需要新建一個存儲 node 以存儲該字符,并將該 node 結構添加到已有的權重表中。 考慮到需要在權重表中舉行字符查找以及之后創(chuàng)建 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; /仿函數(shù),用于find_if,偵測字符是否已經(jīng)存在; /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); /仿函數(shù) vector node :iterator result = find_if(nodetable.begin(),nodetable.end(),bind2nd(comparer(ch), ch); /lamb

8、da 函數(shù)方式; /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、仿函數(shù)不是函數(shù),而是一個類,這個類重載了()操作符; 2、仿函數(shù)調用過程是這樣的:find_if(nodetable.begin(), no

10、detable.end(), comparer(ch) 中 comparer(ch)只是創(chuàng)建了 comparer 類的匿名辦法,重載的 operator() 真正的調用是在 接下來將要看到的 find_if 模板函數(shù)的這一句 pred(*first); 3、代碼中不用法 find 而用法 find_if 是由于需要舉行查找的不是 prime type 而是自行編寫的符合 類型,find_if 的函數(shù)原型參考如下,從原型中可以看到第一個參數(shù)是以默認的方式舉行的: 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 函數(shù)的作用是將 二元算子(binary functor, bf) 轉化為一元算子(unary functor,uf)還有一個類 的bind1st, 用法時需要包含functional頭文件; 5、舉行比較的仿函數(shù)需要繼承 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論