什么是c++的謂詞
謂詞概念:
????????謂詞函數是一個判斷式,一個返回bool值的函數或者仿函數,有幾個入參就是幾元謂詞。一般做一個函數的參數使用【引用自百度百科】。
????????常見的可以作為謂詞的東西:函數、函數指針、函數對象、lambda表達式,庫定義的函數對象。
概念消化:
????????謂詞,即謂語動詞。其實我們可能之前不了解這個概念,但是我們已經經常在使用了,最典型的例子:
使用sort算法對vector元素降序排序:
? ? ? 參3?greater<int>() 就是一個謂詞,它本質上是c++的庫函數對象。
sort(v.begin(), v.end(), greater<int>());
?順便對比回顧下 sort的算法聲明:
sort(iterator beg, iterator end, _Pred); // 按值查找元素,找到返回指定位置迭代器,找不到返回結束迭代器位置 // beg 開始迭代器 // end 結束迭代器 // _Pred 謂詞
? ? ? 參3?_Pred ,就是謂詞,predicate單詞的前綴。
? ? ? ? 其實個人感覺這個名字其實起的還是挺形象的,明確表述了 謂詞 在算法語句中所起的作用,讓程序員能夠自定義算法執行時候“更具體的的動作”。
澄清一點:
????????在之前的學習過程中,發現有些博文或者教程如下定義謂詞。
返回bool類型的仿函數稱為謂詞
如果operator()接受一個參數,那么叫做一元謂詞
如果operator()接受兩個參數,那么叫做二元謂詞
????????但是作為初學者在后續的使用過程中,發現需要傳入謂詞的地方很多時候,傳入一個函數名或者函數指針、或者一個lambda表達式照樣使用。因此,本文章稍微從廣義角度稍微矯正了個人對謂詞的理解。
STL中使用到謂詞的算法快速回顧
????????實際使用中,能感覺到,stl常用算法中大量應用了謂詞,便于程序員執行算法的時候定義“更具體的/自定義的動作”。例如:
例如:遍歷算法
//普通函數
void print01(int val)
{cout << val << " ";
}
//函數對象
class print02
{public:void operator()(int val) {cout << val << " ";}
};//for_each算法基本用法
void test01() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}//遍歷算法for_each(v.begin(), v.end(), print01);cout << endl;for_each(v.begin(), v.end(), print02());cout << endl;
}
例如:查找算法
//內置數據類型
class GreaterFive
{
public:bool operator()(int val){return val > 5;}
};void test01() {vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i + 1);}vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());if (it == v.end()) {cout << "沒有找到!" << endl;}else {cout << "找到大于5的數字:" << *it << endl;}
}
例如:排序算法
sort(v.begin(), v.end(), greater<int>());
例如:拷貝替換算法
class myPrint
{
public:void operator()(int val){cout << val << " ";}
};class ReplaceGreater30
{
public:bool operator()(int val){return val >= 30;}
};void test01()
{vector<int> v;v.push_back(20);v.push_back(30);v.push_back(20);v.push_back(40);v.push_back(50);//將容器中大于等于的30 替換成 3000replace_if(v.begin(), v.end(), ReplaceGreater30(), 3000);for_each(v.begin(), v.end(), myPrint());
}
針對某種算法展開舉例各種謂詞的使用
已經有很多博友在這塊寫過總結,路過的小伙伴可以直接參考:
count_if:
c++中的謂詞:函數、函數指針、函數對象(仿函數)、lambda表達式、bind2nd使用示例_c++ 定義函數做謂詞-CSDN博客
sort:
C++ - 算法(algorithm) 的 謂詞(predicate) 詳解_predicate c++-CSDN博客