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*> () ); //正確