定義
一個判斷式,一個返回bool值的函式或者仿函式。幾元就是函式有幾個參數,至於定義和使用,函式定義和一般的函式定義一樣,仿函式就是寫個類,然後重載operator()。使用就是在那些以這種需要返回bool值的函式作參數的函數裡用了。一元謂詞函式舉例如下
1,判斷給出的string對象的長度是否小於6bool GT6(const string &s)
{
return s.size() >= 6;
}
2,判斷給出的int是否在3到8之間
bool Compare( int i )
{
return ( i >= 3 && i <= 8 );
}
二元謂詞舉例如下
1,比較兩個string對象,返回一個bool值,指出第一個string是否比第二個短bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
算法的命名規則
區別帶有一個值或一個謂詞函式參數的算法版本很多算法通過檢出其輸入範圍內的元素實現其功能。這些算法通常要用到標準關係操作符:== 或 < 。其中的大部分算法會提供第二個版本的函式,允許程式設計師提供比較或測試函式取代操作符的使用。
1,重新對容器元素排序的算法要使用<操作符。這些算法的第二個重載版本帶有一個額外的形參,表示用於元素排序的不同運算:
sort(beg,end); //use < operator to sort the elements
sort(beg,end,comp); //use function named comp to sort the elements
2,檢測指定值的算法默認使用 == 操作符。系統為這類算法提供另外命令的(而非重載的)版本,帶有謂詞函式形參。帶有謂詞函式形參的算法,其名字帶有後綴 _if:
find(beg, end, val); //find first instance of val in the input range
find(beg, end, pred); //find first instance for which pred is true in the input range
上述兩個算法都在輸入範圍內尋找指定元素的第一個實例。其中,find算法查找一個指定的值,而find_if算法則用於查找第一個使謂詞函式pred返回非零值的元素。
標準庫為這些算法提供另外命名的版本,而非重載版本,其原因在於這兩種版本的算法帶有相同數目的形參。而對於排序算法,只要根據參數的個數就很容易消除函式調用的歧義。而對於查找指定元素的算法,不管檢查的是一個值還是謂詞函式,函式調用都需要相同個數的參數。此時,若使用重載版本,則可能導致二義性,儘管幾率很低。因此標準庫為這些算法提供兩種不同名字的版本,而沒有使用重載。