日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中STL的常用算法--1(函数对象,谓词,内建函数对象)

發布時間:2023/11/30 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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>

    算術函數對象

  • 加法:plus plusstringAdd; sres=stringAdd(sva1,sva2);
  • 減法:minus
  • 乘法:multiplies
  • 除法 divides
  • 求余:modulus
  • 取反:negate
  • 關系函數對象

  • 等于 equal_to equal_tostringEqual; sres=stringEqual(sval1,sval2);
  • 不等于 not_equal_to
  • 大于 greater
  • 大于等于 greater_equal
  • 小于 less
  • 小于等于 less_equal
  • 邏輯函數對象

  • 邏輯與 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(函数对象,谓词,内建函数对象)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。