• <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>
            aurain
            技術文摘
            posts - 137,  comments - 268,  trackbacks - 0

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

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

            // ...

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

                   STL另一個優(yōu)雅之處在于高度可配置。在以上的代碼中,使用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協(xié)同使用時,在函數對象中避免(或盡量少)使用數據成員的另一個原因在于,STL實現可能為會一個函數對象產生若干份復制,而且假定所有這些復制都是一致的。為了確保一個對象的所有復制一致,最簡單的方式就是不要讓對象帶有任何數據成員。

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

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

                   請注意在這個sort調用中跟在PopLess后面的圓括號。PopLess是一個類型,但是我們必須傳入一個該類型的對象作為函數的參數。通過在PopLess類型名字后面附加一對圓括號,就創(chuàng)建了一個沒名字的臨時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 閱讀(2893) 評論(1)  編輯 收藏 引用 所屬分類: c/c++基礎知識

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

            <2011年6月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            常用鏈接

            留言簿(17)

            隨筆分類(138)

            隨筆檔案(137)

            網絡開發(fā)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 498821
            • 排名 - 36

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            99国内精品久久久久久久| 国产精品久久久久久影院| 久久久青草久久久青草| 久久精品国产69国产精品亚洲| 99久久er这里只有精品18| 国产精品99精品久久免费| 精品国产VA久久久久久久冰| 中文字幕人妻色偷偷久久| 91久久成人免费| 国产午夜精品理论片久久 | 久久久久女人精品毛片| 久久久久久国产精品无码下载| 2021国内久久精品| 久久亚洲欧美日本精品| 久久免费视频网站| 久久成人18免费网站| 久久久久久国产精品美女| 久久精品中文无码资源站 | 色偷偷偷久久伊人大杳蕉| 99久久精品九九亚洲精品| 久久国产香蕉视频| 久久久久久国产精品美女| 国产成人无码久久久精品一| 青青草国产精品久久| 综合久久一区二区三区 | 国产精品无码久久久久| 国内高清久久久久久| 久久久久久毛片免费播放| 99久久国产主播综合精品| 婷婷久久综合| 精品久久久久久无码国产| 最新久久免费视频| 久久九九青青国产精品| 国产精品久久久香蕉| 久久婷婷久久一区二区三区| 日韩久久久久中文字幕人妻| 嫩草伊人久久精品少妇AV| 中文国产成人精品久久亚洲精品AⅤ无码精品| 久久精品夜夜夜夜夜久久| 欧美日韩中文字幕久久久不卡| 久久久精品人妻一区二区三区蜜桃|