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

aurain
技術文摘
posts - 137,  comments - 268,  trackbacks - 0

       STL不但使我們能夠更輕松、更快捷地編寫復雜的代碼,而且使編寫的代碼既標準又高度優化。

std::vector<std::string> names;

// ...

std::sort(names.begin(), names.end());

       STL另一個優雅之處在于高度可配置。在以上的代碼中,使用string的小于(<)操作符對vector中的string元素進行排序,但在其它場合,未必總有一個小于操作符可供使用,而且有時并不希望以升序方式進行排序。

       class State

{

public:

   // ...

   int population() const;

   float aveTempF() const;

   // ...

};

State類用于表示聯邦的一個州,它沒有小于操作符,而且也不打算為它實現一個,因為“一個州小于另一個州”說不清是什么意思。幸運的是,對于這樣的情形來說,STL一般允許我們指定一個替代的類似小于操作符(less-than-like)的操作。這樣的操作被稱為“比較器”,因為它用于比較兩個值:

       inline bool popLess(const State& a, const State& b)

{

     return a.population() < b.population();

}

擁有針對State的比較器之后,就可以用它進行排序了:

State aUnion[50];

// ...

std::sort(aUnion, aUnion + 50, popLess); // 按人口數進行排序

這里我們傳遞一個指向popLess函數的指針作為比較器(函數名字會退化成一個指針)。因為popLess作為函數指針進行傳遞,所以它在sort內無法被內聯。如果希望得到快速的排序操作,這種做法只能讓人感到遺憾了。

       如果使用函數對象作為比較器,情況就會好很多:

       struct PopLess : public std::binary_function<State, State, bool>

{

   bool operator () (const State& a, const State& b) const

   {

      return a.population() < b.population();

   }

};

       PopLess類型是一個典型的、有著正確構造的STL函數對象的例子。

首先,它是一個函數對象。它重載了函數調用操作符,因此可以以普通函數調用的語法調用。這一點很重要,因為諸如sort這樣的STL泛型算法是以這種方式編寫的:函數指針和函數對象都可以用來實例化它們,只要此二者可以采用典型的函數調用語法進行調用即可。一個具有重載的operator()的函數對象完全可以滿足這個語法要求。

       其次,它派生于標準的binary_function基類。此項機制允許其它部分的STL實現詢問函數對象編譯器問題。在這個例子中,從binary_function派生下來的PopLess類型允許我們找出函數對象的參數和返回值類型。不過在這里我們并沒有利用這種能力,但是可以打賭肯定有人需要這樣的能力,而且希望我們的PopLess類型可以為其他人所用。

       第三,這個函數對象沒有數據成員、沒有虛函數、沒有顯示聲明的構造函數和析構函數,且對operator()的實現是內聯的。用作STL比較器的函數對象一般都很小巧。簡單且快速。當然可以設計一個具有重型實現的STL函數對象,但這種做法通常不是明智之舉。當與STL協同使用時,在函數對象中避免(或盡量少)使用數據成員的另一個原因在于,STL實現可能為會一個函數對象產生若干份復制,而且假定所有這些復制都是一致的。為了確保一個對象的所有復制一致,最簡單的方式就是不要讓對象帶有任何數據成員。

       現在我們就可以使用該函數對象對這個aUnion進行排序:

       std::sort(aUnion, aUnion + 50, PopLess());   // 按人口數進行排序

       請注意在這個sort調用中跟在PopLess后面的圓括號。PopLess是一個類型,但是我們必須傳入一個該類型的對象作為函數的參數。通過在PopLess類型名字后面附加一對圓括號,就創建了一個沒名字的臨時PopLess對象,此對象僅存活于函數調用期間(這個沒名字的對象即總所周知的“匿名臨時對象”)。也可以聲明并傳入一個具名對象:

       PopLess comp;

std::sort(aUnion, aUnion + 50, comp); // 按人口數進行排序

然而,傳入一個匿名臨時對象更簡單、更符合習慣,而且擊鍵次數更少。

使用函數對象作為比較器還有一個額外的好處,就是比較操作將被內聯處理,而使用函數指針則不允許內聯。原因在于,當一個sort函數模板實例化時,編譯器知道比較器的類型是PopLess,從而使它知道PopLess:operator()將被調用,接著使它可以內聯該函數。

STL中,函數對象另一個常見的用途是用作判斷式。判斷式是一個詢問關于單個對象的真/假問題的操作(可以將比較器視作一種二元判斷式)。

struct IsWarm : public std::unary_function<State, bool>

{

   bool operator () (const State& a) const

   {

      return a.aveTempF() > 60;

   }

};

STL判斷式的設計知道方針與STL比較器的一致,唯一的例外在于,前者是一元函數,而非二元函數。從我們前面排過序的State結果開始,采用一個適當的判斷式,可以讓我們很容易就能找到一個氣候溫暖且人數較少的州:

State* warmandsparse = find_if(aUnion, aUnion + 50, IsWarm());

 

posted on 2011-06-29 08:46 閱讀(2909) 評論(1)  編輯 收藏 引用 所屬分類: c/c++基礎知識

FeedBack:
# re: STL函數對象
2011-06-29 17:27 | 陳梓瀚(vczh)
如今可以簡寫為[](onst State& a){return a.aveTempF()>60;}了  回復  更多評論
  

<2009年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用鏈接

留言簿(17)

隨筆分類(138)

隨筆檔案(137)

網絡開發

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 502446
  • 排名 - 37

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产亚洲精品久久久| 欧美日韩第一区日日骚| 亚洲精品免费在线| 久久久久久电影| 夜夜嗨av一区二区三区中文字幕 | 亚洲精品视频一区二区三区| 欧美一区二区三区免费大片| 99香蕉国产精品偷在线观看| 极品少妇一区二区三区精品视频| 国产精品电影网站| 欧美日韩视频在线一区二区观看视频| 久久久噜噜噜久噜久久| 午夜精品久久久久久99热| 99视频精品全国免费| 亚洲二区视频在线| 欧美成人免费小视频| 久久精品视频亚洲| 欧美一站二站| 欧美一区二区三区在线观看| 在线一区二区三区做爰视频网站 | 久久久久久夜| 欧美一区国产一区| 午夜在线电影亚洲一区| 亚洲一区三区视频在线观看| 亚洲免费观看高清完整版在线观看| 欧美国产91| 欧美暴力喷水在线| 免费久久精品视频| 欧美大尺度在线| 欧美成人黑人xx视频免费观看| 久久久久久久网站| 麻豆精品国产91久久久久久| 久久久久国产精品www| 久久精品免费电影| 久久人人97超碰国产公开结果| 久久国产手机看片| 久久野战av| 欧美大成色www永久网站婷| 欧美成人免费网| 亚洲黑丝在线| 日韩亚洲欧美精品| 亚洲制服欧美中文字幕中文字幕| 亚洲先锋成人| 午夜精品99久久免费| 新67194成人永久网站| 久久国产精品一区二区三区| 久久久久久久综合日本| 嫩草伊人久久精品少妇av杨幂| 蜜臀久久99精品久久久画质超高清| 久久婷婷激情| 欧美精品综合| 国产精品中文在线| 精品成人国产在线观看男人呻吟| 亚洲高清一区二| 一本色道久久加勒比88综合| 亚洲永久精品大片| 久久国产一二区| 欧美电影免费观看网站| 亚洲精品日韩欧美| 亚洲尤物视频在线| 久久视频精品在线| 欧美日韩亚洲成人| 国产日韩欧美成人| 亚洲国产欧美日韩精品| 99热在这里有精品免费| 香港久久久电影| 麻豆av一区二区三区久久| 亚洲国产婷婷综合在线精品| 一区二区三区四区五区精品视频| 亚洲欧美中文另类| 欧美11—12娇小xxxx| 国产精品极品美女粉嫩高清在线| 国产日韩在线一区| 亚洲人www| 欧美一级视频一区二区| 欧美第一黄网免费网站| 一个人看的www久久| 久久激情久久| 欧美体内she精视频| 激情综合色丁香一区二区| 一本色道久久加勒比88综合| 久久九九久精品国产免费直播| 亚洲国产高清一区二区三区| 亚洲系列中文字幕| 欧美肥婆bbw| 国产午夜精品全部视频播放| 日韩一级视频免费观看在线| 久久精品国语| 一区二区免费看| 欧美不卡一区| 国产一区二区三区视频在线观看| 一本色道久久加勒比88综合| 久久中文字幕导航| 亚洲摸下面视频| 欧美日韩免费高清一区色橹橹| 激情一区二区| 欧美影片第一页| 日韩午夜电影| 欧美成人性网| 在线观看亚洲视频啊啊啊啊| 午夜在线视频观看日韩17c| 亚洲国产三级网| 久久久亚洲成人| 国产一二精品视频| 羞羞色国产精品| 夜夜精品视频一区二区| 欧美高清视频一二三区| 精品51国产黑色丝袜高跟鞋| 欧美在线视频播放| 在线亚洲一区观看| 欧美日韩一区二区在线| 亚洲精品美女91| 欧美福利视频在线观看| 久久久噜噜噜久久中文字免| 国产欧美va欧美va香蕉在| 亚洲综合清纯丝袜自拍| 亚洲看片免费| 欧美日韩高清在线观看| 日韩视频永久免费观看| 欧美激情精品久久久久久免费印度 | 老司机精品视频一区二区三区| 亚洲在线视频免费观看| 国产精品va| 亚洲欧美日韩第一区| 中文欧美在线视频| 国产精品久久久对白| 亚洲一区二区三区在线播放| 99re在线精品| 欧美午夜精品一区二区三区| 亚洲午夜未删减在线观看| 一本高清dvd不卡在线观看| 欧美日韩在线精品| 亚洲欧美区自拍先锋| 亚洲一区二区三区免费视频| 欧美亚洲第一页| 欧美一区高清| 欧美在线免费看| 在线观看三级视频欧美| 欧美成人一区二区三区在线观看| 久久亚洲影院| 亚洲黄色影院| 亚洲精品一区二区三区婷婷月 | 亚洲一区精品在线| 亚洲视频在线观看免费| 国产精品一区毛片| 久久在线精品| 欧美二区视频| 亚洲中字在线| 亚洲欧美色婷婷| 狠狠色综合色区| 亚洲国产网站| 国产精品成人一区二区艾草| 欧美一区二区在线播放| 久久精品国产亚洲a| 亚洲欧洲日产国产综合网| 99re6这里只有精品| 国产区二精品视| 欧美国产视频一区二区| 欧美日韩中国免费专区在线看| 香港成人在线视频| 久久色在线观看| 亚洲无毛电影| 欧美在线一区二区| 99视频在线观看一区三区| 亚洲自拍偷拍麻豆| 亚洲国产老妈| 亚洲一区二区影院| 亚洲国产乱码最新视频 | 久久久久久久久久久一区| 亚洲欧洲日韩女同| 亚洲午夜久久久久久尤物| 激情成人av在线| 日韩午夜av电影| 一区二区在线免费观看| 日韩香蕉视频| 在线欧美三区| 亚洲午夜久久久久久久久电影院| 伊人久久大香线| 亚洲视频免费| 亚洲激情校园春色| 午夜精品一区二区三区四区| 亚洲精品一区二区在线观看| 亚洲自拍16p| 一本久道综合久久精品| 久久精品国产久精国产一老狼 | 午夜精品一区二区三区在线播放| 在线观看欧美精品| 亚洲男女自偷自拍图片另类| 亚洲精品看片| 久久久久久久久久久一区| 亚洲免费视频观看| 欧美电影在线观看完整版| 久久精品国产91精品亚洲| 欧美揉bbbbb揉bbbbb| 女生裸体视频一区二区三区| 国产精品入口夜色视频大尺度| 亚洲国产精品一区二区www| 国模 一区 二区 三区| 中文亚洲视频在线| 夜夜夜久久久|