複製鏈接
請複製以下鏈接發送給好友

謂詞函數

鎖定
謂詞函數是一個判斷式,一個返回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返回非零值的元素。
標準庫為這些算法提供另外命名的版本,而非重載版本,其原因在於這兩種版本的算法帶有相同數目的形參。而對於排序算法,只要根據參數的個數就很容易消除函數調用的歧義。而對於查找指定元素的算法,不管檢查的是一個值還是謂詞函數,函數調用都需要相同個數的參數。此時,若使用重載版本,則可能導致二義性,儘管幾率很低。因此標準庫為這些算法提供兩種不同名字的版本,而沒有使用重載。