青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

為生存而奔跑

   :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我參與的團(tuán)隊(duì)

搜索

  •  

積分與排名

  • 積分 - 331734
  • 排名 - 74

最新評論

閱讀排行榜

評論排行榜

眾所周知,STL使用起來非常方便,其中仿函數(shù)(functor)扮演了一個非常重要的角色。靈活運(yùn)用仿函數(shù)的使用對于發(fā)揮STL強(qiáng)大功能非常關(guān)鍵。本文詳細(xì)介紹了如何使用mem_fun和mem_fun1來綁定類成員函數(shù),使之成為functor

什么是仿函數(shù)?就是一個重載了"()"運(yùn)算符的struct,例如:

struct print_obj{
   
void operator(int a)const{
        
cout<<a<<endl;
    }
};

在STL的許多算法(algorithm)中都需要使用functor. 如:for_each. 同樣在關(guān)聯(lián)容器中也需要使用functor, 如map, set等。經(jīng)常在使用STL算法的時候,經(jīng)常需要把仿函數(shù)和類聯(lián)系在一起,如果可以直接使用類的成員函數(shù)作為仿函數(shù),那就方便多了。mem_fun的功能就是如此。

先看個簡單的例子:

struct D {
  D(int i=0){num=i;}
  int num;
};
struct print_D{
 
void operator()(const D* d)const{
     
cout<<"I am D. my num="<<d->num<<endl;
    }
};

int main()
{
  vector<D*> V;

  V.push_back(new D(1));
  V.push_back(new D(2));
  V.push_back(new D);
  V.push_back(new D(3));

  for_each(V.begin(), V.end(), print_D());
}
編譯輸出:

I am D. my num=1
I am D. my num=2
I am D. my num=0
I am D. my num=3

如果使用mem_fun,會方便很多:

struct D {
  D(int i=0){num=i;}
  void print() { cout << "I'm a D. my num=" << num<< endl; }
  int num;
};

int main()
{
  vector<D*> V;

  V.push_back(new D(1));
  V.push_back(new D(2));
  V.push_back(new D);
  V.push_back(new D(3));

  for_each(V.begin(), V.end(), mem_fun(&D::print));
}

是不是省了一個仿函數(shù)?方便多了,沒錯吧。這也更符合面向?qū)ο蟮囊?guī)則。不過這樣好像讓人難以理解,這里告訴你一個理解STL的訣竅:

    如果對STL的某個部分不了解,就去看源碼,源碼是最好的老師。

那看看源碼是怎么回事,在SGI STL的stl_function.h:

template <class _Ret, class _Tp>
inline mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)())
{ return mem_fun_t<_Ret,_Tp>(__f); }

原來mem_fun返回的是一個對象:mem_fun_t<_Ret,_Tp>.(不要嫌人家命名太怪異).那mem_fun_t<_Ret,_Tp>又是什么東東?還是看源碼:

template <class _Ret, class _Tp>
class mem_fun_t : public unary_function<_Tp*,_Ret> {
public:
   
explicit mem_fun_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {}
    _Ret operator()(_Tp* __p)
const { return (__p->*_M_f)(); }
private:
    _Ret (_Tp::*_M_f)();
};

看明白了嗎?原來mem_fun_t就是一個functor,這下就滿足了for_each的要求了。其調(diào) 用流程是這樣的,for_each把vector中的元素傳送給mem_fun,mem_fun自己產(chǎn)生一個仿函數(shù)mem_fun_t,然后仿函數(shù)調(diào)用其 重載的()。過程就這么簡單。當(dāng)然你不能對其他類的成員函數(shù)進(jìn)行綁定,因?yàn)樵趂or_each調(diào)用過程中,會傳遞其*iterator值,如果是其他類的 成員函數(shù),那么這個類的對象無法傳入,當(dāng)然就無法完成任務(wù)了。

這里使用的是vector<D*> V; 在mem_fun_t構(gòu)造函數(shù)中,剛好需要指針,如果不是D*, 而是使用vector<D> V; 還能用嗎?

這是你需要使用的是mem_fun_ref。把程序改成:

struct D {
  D(int i=0){num=i;}
  void print() { cout << "I'm a D. my num=" << num<< endl; }
  int num;
};

int main()
{
  vector<D> V;

  V.push_back(D(1));
  V.push_back( D(2));
  V.push_back( D());
  V.push_back( D(3));

  for_each(V.begin(), V.end(), mem_fun_ref(&D::print));
}

一切都OK了。

mem_fun對于一些多態(tài)的虛函數(shù)也十分有用,注意看下面的例子:

struct B {
  virtual void print() = 0;
};

struct D1 : public B {
  void print() { cout << "I'm a D1" << endl; }
};

struct D2 : public B {
  void print() { cout << "I'm a D2" << endl; }
};

int main()
{
  vector<B*> V;

  V.push_back(new D1);
  V.push_back(new D2);
  V.push_back(new D2);
  V.push_back(new D1);

  for_each(V.begin(), V.end(), mem_fun(&B::print));
}

posted on 2009-12-01 18:31 baby-fly 閱讀(690) 評論(0)  編輯 收藏 引用 所屬分類: Effective STL / C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品在线看| 先锋影音国产精品| 欧美极品aⅴ影院| 久久久久久久999| 噜噜噜噜噜久久久久久91| 久久深夜福利| 欧美黄色网络| 欧美日韩在线播放一区| 欧美日韩日本国产亚洲在线| 欧美午夜宅男影院在线观看| 国产精品视频网站| 原创国产精品91| 亚洲国产小视频| 一区二区毛片| 欧美一区二区三区视频免费播放| 欧美一区二区精品久久911| 久久精品亚洲一区二区| 久久综合伊人77777| 亚洲欧洲一区二区三区| 欧美激情欧美激情在线五月| 亚洲欧洲精品一区二区三区| 亚洲尤物在线| 欧美+亚洲+精品+三区| 国产精品国产亚洲精品看不卡15| 国产伊人精品| 一区二区高清在线观看| 久久久久国产精品厨房| 亚洲国产欧美精品| 亚洲欧美中文日韩v在线观看| 免费在线看一区| 国产免费成人| 一本久久综合亚洲鲁鲁五月天| 午夜久久黄色| 亚洲精品久久久久中文字幕欢迎你 | 国产一区二区三区四区hd| 亚洲精品一区二区三区樱花 | 黄色一区二区三区四区| 一区二区三区精品在线| 美玉足脚交一区二区三区图片| 一区二区三区国产精华| 免费永久网站黄欧美| 国产欧美精品一区二区色综合| 欧美一区在线视频| 欧美日韩第一区| 亚洲国产精品一区制服丝袜| 亚洲欧美综合另类中字| 91久久中文| 蜜臀久久久99精品久久久久久| 国产日韩精品视频一区二区三区 | 玖玖玖免费嫩草在线影院一区| 亚洲精选久久| 欧美激情第六页| 亚洲激情视频网站| 欧美成人精品在线观看| 久久精品夜色噜噜亚洲a∨ | 亚洲黄色视屏| 久久久夜夜夜| 国内精品免费在线观看| 欧美亚洲日本国产| 亚洲天堂av在线免费| 欧美日韩综合不卡| 在线性视频日韩欧美| 亚洲六月丁香色婷婷综合久久| 欧美jizz19性欧美| 亚洲精品久久7777| 亚洲全部视频| 欧美喷潮久久久xxxxx| 亚洲卡通欧美制服中文| 亚洲国产日韩在线| 欧美日韩999| 亚洲视频在线播放| 亚洲视频在线观看免费| 国产精品久久午夜夜伦鲁鲁| 亚洲欧美日韩国产精品 | 中文欧美日韩| 国产精品一卡二卡| 久久电影一区| 久久久久久国产精品一区| 亚洲第一精品夜夜躁人人爽| 欧美激情一区二区三区不卡| 欧美国产在线视频| 亚洲永久免费av| 欧美在线观看视频| 亚洲国产精品久久久久秋霞影院| 欧美激情第一页xxx| 欧美日韩亚洲精品内裤| 久久本道综合色狠狠五月| 久久精品国产亚洲精品| 亚洲国产成人高清精品| 日韩天天综合| 国内精品视频在线播放| 亚洲第一毛片| 国产精品久久久久影院色老大 | 欧美久久久久久久| 国产精一区二区三区| 蜜桃久久av一区| 欧美日韩亚洲一区| 久久久久久伊人| 欧美美女日韩| 裸体一区二区三区| 国产精品扒开腿做爽爽爽视频 | 久久婷婷人人澡人人喊人人爽| 久久婷婷人人澡人人喊人人爽| 亚洲人成艺术| 欧美一级片久久久久久久| 亚洲精品婷婷| 欧美影视一区| 亚洲一级片在线看| 老**午夜毛片一区二区三区| 亚洲尤物视频网| 欧美成人视屏| 久久久五月婷婷| 国产精品国色综合久久| 欧美高清视频在线观看| 国产伪娘ts一区| 99在线精品观看| 亚洲大胆视频| 久久国产免费看| 欧美一区成人| 国产精品va| 亚洲精品视频免费| 亚洲黄色一区| 巨胸喷奶水www久久久免费动漫| 午夜日韩电影| 欧美日韩你懂的| 最近看过的日韩成人| 韩日欧美一区二区三区| 亚洲午夜在线观看| 亚洲一区免费视频| 欧美日韩一区不卡| 99国产成+人+综合+亚洲欧美| 亚洲第一视频网站| 久久精品在线| 美女被久久久| 在线欧美影院| 久久久综合激的五月天| 久久在线视频在线| 国产亚洲精品久| 欧美一级夜夜爽| 久久精品人人做人人综合 | 欧美韩日一区二区三区| 狠狠综合久久av一区二区小说 | 欧美精品乱人伦久久久久久| 欧美成人情趣视频| 亚洲黄色免费电影| 欧美精品一区二区三区在线看午夜 | 亚洲激情网站| 美腿丝袜亚洲色图| 亚洲高清免费视频| 亚洲精选久久| 欧美日本免费| 一本不卡影院| 亚洲欧美日韩在线观看a三区| 欧美日韩中文字幕综合视频| 这里只有精品丝袜| 久久精品人人做人人爽| 在线电影院国产精品| 欧美成人午夜77777| 夜夜嗨av一区二区三区网站四季av | 国内外成人免费激情在线视频| 欧美在线一级视频| 欧美激情乱人伦| 亚洲视频在线观看三级| 国产精品日韩在线| 久久人人精品| 日韩亚洲欧美在线观看| 欧美在线播放视频| 亚洲国产成人久久| 国产精品扒开腿爽爽爽视频| 欧美主播一区二区三区| 亚洲成人资源| 午夜精品久久久久久久99樱桃| 黑人一区二区| 欧美日韩精品福利| 久久久国产91| 中文日韩欧美| 欧美+日本+国产+在线a∨观看| 99视频精品| 国产一区二区三区在线观看网站| 久久艳片www.17c.com| 亚洲午夜在线观看视频在线| 免费欧美电影| 性欧美大战久久久久久久久| 亚洲国产精品精华液网站| 国产精品免费看久久久香蕉| 老司机成人网| 性色av一区二区怡红| 亚洲精品一区二区三区99| 久久另类ts人妖一区二区| 亚洲午夜一二三区视频| 在线观看亚洲a| 国产精品伊人日日| 欧美日韩午夜精品| 免费观看成人| 久久国产精品黑丝| 亚洲影院色无极综合| 亚洲精品免费在线观看| 欧美福利视频在线观看| 久久久久久黄| 久久国产精彩视频|