C++中的可調用對象

c++中的可調用對象有以下幾種:

  • 函數
  • 函數指針
  • bind創建的對象
  • lambda表達式
  • 重載函數調用運算符的類
  • 函數對象

都可以在使用算法時作爲謂詞來調用


lambda表達式

[capture list] (parameter list) -> return type { function body }

capture 是一個lambda表達式所在函數中定義的局部變量列表,可以捕獲使用,可以通過加上 &進行引用捕獲,不加&表示值捕獲

可以忽略返回類型和參數列表,但必須要有捕獲列表和函數體

auto f = [] { return 42; }
cout << f() << endl;        // 打印 42

如果 lambda 表達式包含任何單一 return 語句之外的內容,且未指定返回類型,則返回 void

使用 lambda 調用 stable_sort

//按長度排序
stable_sort (words.begin(), words.end(), [] (const string &a, const string &b) { return a.size() > b.size(); } );

類重載函數調用運算符

定義一個類,重載函數調用運算符

class ShorterString {
public:
    bool operator() (const string &s1, const string &s2) const
        { return s1.size() < s2.size(); }
}

可以使用 ShorterString 的未命名對象來代替 lambda表達式

stable_sort( words.begin(), words.end(), ShorterString() );

函數對象

c++標準庫定義了多個表示運算符的函數對象,常用來替換算法中的默認運算符

算術 關係 邏輯
plus<type> equal_to<Type> logical_and<Type>
minus<Type> not_equal<Type> logical_or<Type>
multiplies<Type> greater_<Type> logical_not<Type>
divides<Type> greater_equal<Type>
modulus<Type> less<Type>
negate<Type> less_equal<Type>

使用sort()函數默認是按照從小到大排序,可以在sort()加入greater<type>按照從大到小排序,替換sort()中的<運算符 :

sort(svec.begin(), svec.end(), greater<string>() );

如果我們試圖比較兩個無關指針將產生未定義的行爲,而使用標準庫函數可以解決。
比如我希望通過比較指針的內存地址來sort指針的vector

vector<string *> nameTable;     //指針的 vector
sort(nameTable.begin(), nameTable.end(), [] (string *a, string *b) { return a < b; });      //錯誤: nameTable 中的指針之間沒有關係
sort(nameTable.begin(), nameTable.end(), less<string*> () );        //正確

bind創建的對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章