c++中STL的常用算法--1(函数对象,谓词,内建函数对象)
生活随笔
收集整理的這篇文章主要介紹了
c++中STL的常用算法--1(函数对象,谓词,内建函数对象)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
函數對象
重載函數調用操作符的類,其對象常稱為函數對象(function object),即它們是行為類似函數的對象,也叫仿函數(functor),其實就是重載"()"操作符,使得類對象可以像函數那樣調用
注意:
分類:
假定某個類有一個重載的operator(),而且重載的operator()要求獲取一個參數,我們就將這個類稱為**“一元仿函數**”,如果重載的operator()要求獲取兩個參數,就將這個類稱為"二元仿函數”
函數對象的作用主要是什么?STL提供的算法往往都有兩個版本,其中一個版本表現出最常用的某種運算,另一版本則允許用戶通過template參數的形式來指定所要采取的策略
函數對象調用
#include<iostream> using namespace std;class Myprint { public:void operator ()(int num){cout << "num" << num << endl;count++;}int count = 0; };void MyPrint2(int num) {cout << "num" << num << endl; }void test01() {//MyPrint是一個類,而不是函數Myprint myPrint;myPrint(111); //仿函數調用//MyPrint2(111);//函數調用Myprint()(1000);//匿名對象調用 }函數對象超出了普通函數的概念,可以保存狀態
//函數對象是一個類型,是由類中定義的,所有可以保存一些狀態void test02(){Myprint myPrint;myPrint(111);myPrint(111);myPrint(111);myPrint(111);cout << "myPrint使用次數:" << myPrint.count << endl;}函數對象作為參數傳遞
void doPrint(Myprint print, int num) {print(num); } void test03() {doPrint(Myprint(), 20);}總結
謂詞
謂詞是指普通函數或重載的operator()返回值是bool類型的函數對象(仿函數)。如果operator接受一個參數,那么叫做一元謂詞,如果接受兩個參數,那么叫做二元謂詞,謂詞可作為一個判斷式
一元謂詞
#include<iostream>using namespace std; #include<vector> #include<algorithm>class CreateThen20 { public:bool operator()(int val){return val > 20;} };//一元謂詞 void test01() {vector<int>v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);//查找第一個大于20的數字//第三個參數 函數對象,匿名對象vector<int>::iterator pos= find_if(v.begin(), v.end(),CreateThen20());if (pos != v.end()){cout << "找到大于20的數字為:" << *pos << endl;} }二元謂詞
class MyCompare { public:bool operator()(int v1, int v2){return v1 > v2;} };void test02() {vector<int>v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);sort(v.begin(), v.end(), MyCompare());//匿名函數 lambda表達式 []函數名()參數{}實現體 [](int val){cout << val << " "; }for_each(v.begin(), v.end(), [](int val){cout << val << " "; }); }int main() {//test01();test02();system("pause");return 0; }內建函數對象
STL內建一些函數對象。分為:算術類函數對象,關系運算類函數對象,邏輯運算類仿函數。這些仿函數所產生的對象,用法和一般函數完全相同,當然我們還可以產生無名的臨時對象來履行函數的功能,使用內建函數對象,需要引用頭文件#include<functional>
算術函數對象
關系函數對象
邏輯函數對象
邏輯與 logical_and logical_andindAnd; ires=intAnd(ival1,ival2); dres=BinaryFunc(logical_and(),dval1,dval2);
邏輯或 logical_or
邏輯非 logical_not logical_notIntNot; Ires=IntNot(ival1); Dres=UnaryFunc(logical_not,dval1);
#include<iostream>using namespace std; //內建函數對象的頭文件 #include<functional> #include<vector> #include<algorithm>void test01() {//template<Class T>T negate<T>//取反仿函數negate<int>n;cout << n(10) << endl;//加法 template<Class T> T plus<T>//加法仿函數plus<int>p;cout << p(1, 1) << endl; }//template<Class T> bool greater<T>大于運算符 void test02() {vector<int>v;v.push_back(10);v.push_back(30);v.push_back(50);v.push_back(20);v.push_back(40);sort(v.begin(), v.end(), greater<int>());for_each(v.begin(), v.end(), [](int val){cout << val << " "; });}int main() {//test01();test02();system("pause");return 0; }總結
以上是生活随笔為你收集整理的c++中STL的常用算法--1(函数对象,谓词,内建函数对象)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++中利用STL实现公司员工分组问题
- 下一篇: 成都大熊猫繁育基地对人民警察免票吗