日韩性视频-久久久蜜桃-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(函数对象,谓词,内建函数对象)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 黄色一区二区三区四区 | 日本精品网 | 玖玖精品国产 | 天天综合天天做 | 老司机精品视频在线播放 | 日韩伦理视频 | 波多野结衣mp4 | 久久亚洲影视 | 午夜激情免费 | 图片区亚洲 | 六月婷婷激情 | 成人精品视频一区二区三区尤物 | 污视频网站在线观看 | 日本老年老熟无码 | 91九色视频 | 新天堂在线 | 福利在线一区 | ,午夜性刺激免费看视频 | 麻豆国产精品一区 | 80日本xxxxxxxxx96 亚洲国产精品视频在线 | 一本高清dvd在线播放 | 国产精品久久久久久久免费大片 | 少妇一级淫片免费放2 | 高清国产午夜精品久久久久久 | 国产精品嫩草影院桃色 | 一级人爱视频 | 亚洲在线电影 | ass日本寡妇pics | 欧美成人小视频 | 成人va在线观看 | 人妻少妇被粗大爽9797pw | 亚洲第一中文字幕 | 九九热播视频 | 午夜精品久久久久 | 欧美视频直播网站 | 欧美激情免费看 | 高潮一区二区三区乱码 | 欧美一级黄 | 成人深夜免费视频 | 成人片黄网站久久久免费 | 亚洲av无码专区首页 | 日韩伦理av | 国产精品一页 | 久久天堂精品 | 国产区福利 | 亚洲精品国产精品乱码桃花 | 综合亚洲色图 | 日韩人妻无码精品久久免费 | 亚洲夜夜爱 | 亚洲一区二区三区无码久久 | 亚洲淫 | 亚洲性自拍 | 日韩中文在线字幕 | 欧美一区二区三区爽爽爽 | 在线香蕉视频 | 午夜婷婷| 国产精品jizz在线观看老狼 | 亚洲精选av | 三级全黄做爰龚玥菲在线 | 国产中文一区二区 | 91大神在线免费观看 | 欧美激情视频网址 | 黑人和白人做爰 | 青青伊人久久 | 亚洲图片三区 | 福利在线视频观看 | 成人免费毛片网 | 懂色av蜜臂av粉嫩av | 8090理论片午夜理伦片 | 欧美精品一区二区性色a+v | 秋霞成人网 | 亚洲综合在 | 噜噜色网 | 欧美日韩丝袜 | 三级av在线免费观看 | 日本伦理中文字幕 | 亚洲色图视频在线 | 浮生影视在线观看免费 | 国产精选91 | xxxxx色| 色哟哟视频网站 | 久久久视 | 国产三级av在线播放 | 国产成人久久 | 邻居少妇张开腿让我爽了在线观看 | 高柳家在线观看 | 天堂国产 | 日本成人a | 免费观看一区二区三区视频 | 天天色综合天天 | 欧美成人一区二区三区高清 | 欧美久久久久久久久久久久 | 天天综合网久久综合网 | 一本一道波多野结衣一区二区 | 日本人妻一区二区三区 | 一本一道久久a久久精品综合 | 高清av不卡| 双性皇帝高h喷汁呻吟 | 手机看片午夜 |