謂詞函式

謂詞函式是一個判斷式,一個返回bool值的函式或者仿函式。幾元就是函式有幾個參數,至於定義和使用,函式定義和一般的函式定義一樣,仿函式就是寫個類,然後重載operator()。使用就是在那些以這種需要返回bool值的函式作參數的函數裡用了。

一元舉例,二元舉例,算法命名規則,

一元舉例

1,判斷給出的string對象的長度是否小於6
bool 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_if(beg, end, pred); //find first instance for which pred is true in the input range
上述兩個算法都在輸入範圍內尋找指定元素的第一個實例。其中,find算法查找一個指定的值,而find_if算法則用於查找第一個使謂詞函式pred返回非零值的元素。
標準庫為這些算法提供另外命名的版本,而非重載版本,其原因在於這兩種版本的算法帶有相同數目的形參。而對於排序算法,只要根據參數的個數就很容易消除函式調用的歧義。而對於查找指定元素的算法,不管檢查的是一個值還是謂詞函式,函式調用都需要相同個數的參數。此時,若使用重載版本,則可能導致二義性,儘管幾率很低。因此標準庫為這些算法提供兩種不同名字的版本,而沒有使用重載。

相關詞條

熱門詞條

聯絡我們