STL之函數適配器

1.理論知識

這里寫圖片描述
這里寫圖片描述
這里寫圖片描述

2.常用函數適配器

標準庫提供一組函數適配器,用來特殊化或者擴展一元和二元函數對象。常用適配器是:

1綁定器(binder):

binder通過把二元函數對象的一個實參綁定到一個特殊的值上,將其轉換成一元函數對象。C++標準庫提供兩種預定義的binder適配器:bind1st和bind2nd,前者把值綁定到二元函數對象的第一個實參上,后者綁定在第二個實參上。

2取反器(negator) :

negator是一個將函數對象的值翻轉的函數適配器。標準庫提供兩個預定義的ngeator適配器:not1翻轉預定義一元函數對象的真值,而not2翻轉二元謂詞函數的真值。

常用函數適配器列表如下:

bind1st(op, value)
bind2nd(op, value)
not1(op)
not2(op)
mem_fun_ref(op)
mem_fun(op)
ptr_fun(op)

3.典型案例

class IsGreat
{
public:IsGreat(int i){m_num = i;}bool operator()(int &num){if (num > m_num){return true;}return false;}
protected:
private:int m_num;
};void main43()
{vector<int>  v1;for (int i=0; i<5; i++){v1.push_back(i+1);}for (vector<int>::iterator it = v1.begin(); it!=v1.end(); it ++){cout << *it << " " ;}int num1 = count(v1.begin(), v1.end(), 3);cout << "num1:" << num1 << endl;//通過謂詞求大于2的個數int num2 = count_if(v1.begin(), v1.end(), IsGreat(2)); cout << "num2:" << num2 << endl;//通過預定義函數對象求大于2的個數   greater<int>() 有2個參數 //                                              param > 2int num3 = count_if(v1.begin(), v1.end(), bind2nd(greater<int>(), 2 ) );cout << "num3:" << num3 << endl;//取模 能被2整除的數 求奇數int num4 = count_if(v1.begin(), v1.end(), bind2nd(modulus <int>(), 2 ) ); cout << "奇數num4:" << num4 << endl;int num5 = count_if(v1.begin(), v1.end(), not1( bind2nd(modulus <int>(), 2 ) ) ); cout << "偶數num5:" << num5 << endl;return ;
}

4.預定義函數對象和適配器案例代碼

#include <iostream>
using namespace std;#include "string"
#include <vector>
#include <list>
#include "set"
#include <algorithm>
#include "functional"//plus<int> 預定義好的函數對象 能實現不同類型的數據的 + 運算
//實現了 數據類型 和算法的分離 ===》通過函數對象技術實現的。。。。//思考:怎么樣知道 plus<type> 是兩個參數
void main21()
{/*template<class _Ty>struct plus: public binary_function<_Ty, _Ty, _Ty>{   // functor for operator+_Ty operator()(const _Ty& _Left, const _Ty& _Right) const{   // apply operator+ to operandsreturn (_Left + _Right);}};*/plus<int> intAdd;int x = 10; int y = 20;int z = intAdd(x, y); // x + y cout << "z:" << z << endl;plus<string> stringAdd;string s1 = "aaa";string s2 = "bbb";string s3 = stringAdd(s1, s2);cout << "s3:" << s3 << endl;vector<string> v1;v1.push_back("bbb");v1.push_back("aaa");v1.push_back("ccc");v1.push_back("zzz");v1.push_back("ccc");v1.push_back("ccc");/*template<class _Ty>struct greater: public binary_function<_Ty, _Ty, bool>{   // functor for operator>bool operator()(const _Ty& _Left, const _Ty& _Right) const{   // apply operator> to operandsreturn (_Left > _Right);}};*/sort(v1.begin(), v1.end(), greater<string>() );for (vector<string>::iterator it=v1.begin(); it!=v1.end(); it++){cout << *it << endl;}//求 ccc 出現的個數string sc = "ccc";//equal_to<string>() 有兩個參數 left參數來自容器,right參數來自sc//bind2nd函數適配器 :把預定義函數對象 和 第二個參數進行綁定int num = count_if(v1.begin(), v1.end(), bind2nd(equal_to<string>(), sc) );cout << "num: " << num << endl;
}class IsGreat
{
public:IsGreat(int i){m_num = i;}bool operator()(int &num){if (num > m_num){return true;}return false;}
private:int m_num;
};void main22()
{vector<int> v1;for (int i=0; i<10; i++){v1.push_back(i+1);}for (vector<int>::iterator it=v1.begin(); it!=v1.end(); it++ ){cout << *it << " ";}cout << endl;int num1 = count(v1.begin(), v1.end(), 3);cout << "num1:" << num1 <<endl;//通過 謂詞 求大于2 的個數int num2 = count_if(v1.begin(), v1.end(),  IsGreat(2));cout << "num2:" << num2 <<endl;/*template<class _Ty>struct greater: public binary_function<_Ty, _Ty, bool>{   // functor for operator>bool operator()(const _Ty& _Left, const _Ty& _Right) const{   // apply operator> to operandsreturn (_Left > _Right);}};*///通過 預定義的函數對象 求大于2 的個數//greater<int>() 有兩個參數 左參數來自容器的元素 ,右參數固定成2 (通過bind2nd做的)int num3 = count_if(v1.begin(), v1.end(), bind2nd (greater<int>(), 2) );cout << "num3:" << num3 <<endl;//求 奇數的個數int num4 = count_if(v1.begin(), v1.end(), bind2nd (modulus<int>(), 2) );cout << "奇數的個數num4:" << num4 <<endl;//求 偶數的個數 取反器(negator) int num5 = count_if(v1.begin(), v1.end(), not1( bind2nd (modulus<int>(), 2) ) );cout << "偶數的個數 num5:" << num5 <<endl;}
void main2222()
{//main21();main22(); //函數適配器綜合案例cout<<"hello..."<<endl;system("pause");return ;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448320.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448320.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448320.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

真正理解 git fetch, git pull 以及 FETCH_HEAD

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 真正理解 git fetch, git pull 要講清楚git fetch&#xff0c;git pull,必須要附加講清楚git remote&#xff0c;git merge 、遠程rep…

pyqt5 + pyinstaller 制作爬蟲小程序

環境:mac python3.7 pyqt5 pyinstaller ps: 主要是熟悉pyqt5, 加入了單選框 輸入框 文本框 文件夾選擇框及日歷下拉框 效果圖: pyqt5 主程序文件 # -*- coding: utf-8 -*- # Author: Mehaei # Date: 2019-07-10 13:02:56 # Last Modified by: Mehaei # Last Modified time…

通過學校區域

通過學校區域的要求 應觀察前后左右的交通情況&#xff0c;適時減速慢行&#xff0c;不得鳴喇叭和與學生搶行。 操作方法 當駕駛車輛行至學校附近或有注意兒童標志路段時&#xff0c;一定要及時減速&#xff0c;注意觀察道路兩側或周圍的情況&#xff0c;時刻堤防學生橫…

axios中出現兩次請求,OPTIONS請求和GET請求

在項目中發現ajax中出現兩次請求&#xff0c;OPTIONS請求和GET請求 查看到瀏覽器NetWork有兩次請求&#xff0c;請求url一樣&#xff1a; 查找原因是瀏覽器對簡單跨域請求和復雜跨域請求的處理區別。 XMLHttpRequest會遵守同源策略(same-origin policy). 也即腳本只能訪問相同協…

筆試面試收獲(持續更新中)

1. Internet 是有ARPANET發展而來 2. NFS&#xff08;Network File System&#xff09;即網絡文件系統 3. OSI參考模型七層&#xff1a;物理層&#xff0c;數據鏈路層&#xff0c;網絡層&#xff08;IP,路由器&#xff0c;三層交換機&#xff09;&#xff0c;傳輸層&#xff…

Linux 安裝 配置 Maven

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.需要提前安裝JDK&#xff0c;并且配置環境變量 請參考&#xff1a;https://blog.csdn.net/jiangyu1013/article/details/84321146 2.…

Threading in C#

這里推薦一些C#編程多線程的學習資料&#xff1a; http://knowledge.swanky.wu.googlepages.com/threading_in_c_sharp.html Ebook in English&#xff1a;http://cid-068f7d75d8585700.skydrive.live.com/self.aspx/ebook/threading.pdf 一些demo&#xff1a;http://cid-068f7…

經理人如何與這“六種人”打交道?

在職場中&#xff0c;我們要與不同身份、不同年齡、不同崗位、不同性別、不同性格的人打交道。在平時的實際工作接觸中&#xff0c;善于與不同人打交道的經理人&#xff0c;會根據不同的情況用不同的態度和方式來對待之。 1、如何與死板的人打交道 與這樣的人交往&#xff0c…

[Git高級教程 (一)] 通過 Tag 標簽回退版本修復 bug

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1 前言 本系列之所以取名”Git高級教程”&#xff0c;主要是教大家解決實際工作中遇到的問題&#xff0c;要求讀者會基本的Git用法和命令…

Javascript 自定義輸出

緣由 前段時間再看了一些javascript的學習資料,也寫的一些demo,在輸出的時候一般都用alert,但這個方法會打斷函數運行,用起來不是很好.還有就是console.log這個方法,這種方法原來一直以為只能在FireFox上面才能用,現在才發現主流瀏覽器都支持.但我的這個插件已經寫的差不多了,所…

不要打2歲內和6歲后的孩子 父母必看

一位媽媽說&#xff1a;“孩子經常無理取鬧&#xff0c;到超市就要買這買那&#xff0c;不給買就坐在地上哭鬧。到別人家去就亂翻亂動&#xff0c;還會到人家沙發上亂蹦&#xff0c;無論你怎么說&#xff0c;孩子都不聽話。每次我都會氣不打一處來&#xff0c;回到家就痛打一頓…

設計模式之開放封閉原則

以下皆是個人理解如有不對請留言指出&#xff0c;謝謝&#xff01; 我就代碼提出我自己個人的看法&#xff1a; 正常定義一個類例如銀行工作員&#xff0c;他可以執行存款&#xff0c;付款和轉賬功能&#xff0c;如果在現有功能上我想添加貸款功能&#xff0c;需要在類中添加…

[Git高級教程(二)] 遠程倉庫版本回退方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1 簡介 最近在使用git時遇到了遠程分支需要版本回滾的情況&#xff0c;于是做了一下研究&#xff0c;寫下這篇博客。 2 問題 如果提交了…

uplift model學習筆記

一、解決的問題&#xff1a; 通常的 Propensity Model 和 Response Model 只是給目標用戶打了個分&#xff0c;并沒有確保模型的結果可以使得活動的提升最大化&#xff1b;它沒有告訴市場營銷人員&#xff0c;哪個用戶最有可能提升活動響應&#xff1b; 因此&#xff0c;需要另…

必須看透的50個錯覺 人生要看透而不看破!

我們應該感謝命運的多喘&#xff0c;是它用歷練使一顆脆弱心的漸漸變得堅強&#xff0c;變得對一切都充滿了向往。無可否認&#xff0c;只有真正的經歷了一些事物之后&#xff0c;你才會對人生看得更加透徹&#xff0c;才會對世間真情感悟的更加真切。 1、個人只能被現實改變…

設計模式之依賴倒置原則

在傳統的過程式中&#xff0c;上層依賴于底層&#xff0c;當底層變化&#xff0c;上層也得跟著做出相應的變化。這就是面向過程的思想&#xff0c;弊端就是導致程序的復用性降低并且提高了開發的成本。 而面向對象的開發則很好的解決了這個問題&#xff0c;讓用戶程序依賴于抽象…

@Transactional 詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Transactional 是聲明式事務管理 編程中使用的注解 1 .添加位置 1&#xff09;接口實現類或接口實現方法上&#xff0c;而不是接口類中…

LiveGBS高性能GB28181國標流媒體服務流傳輸模式支持UDP、TCP被動、TCP主動模式

LiveGBS國標(GB28181)流媒體服務軟件&#xff1a; 提供用戶管理及Web可視化頁面管理&#xff1b; 提供設備狀態管理&#xff0c;可實時查看設備是否掉線等信息&#xff1b; 實時流媒體處理&#xff0c;PS&#xff08;TS&#xff09;轉ES&#xff1b; 設備狀態監測、云臺控制、錄…

通過人行橫道線

學車中的通過人行橫道線 人行橫道線&#xff0c;俗稱斑馬線&#xff0c;是由一條一條的白色線組成的&#xff0c;主要是用來讓行人穿越馬路的。 駕駛員駕駛車輛通過人行橫道時應該減速緩行&#xff0c;注意禮讓行人。 考核要求 當駕車進入路面有施劃人行橫道線的&#xf…

python學習-38迭代器和生成器

迭代器和生成器---- 迭代器協議和for循環工作機制1.迭代器協議&#xff1a;對象必須提供一個next方法&#xff0c;執行該方法要么返回迭代中的下一項&#xff0c;要么引起一個Stoplteration異常&#xff0c;以終止迭代&#xff08;只能往后走&#xff0c;不能往前走&#xff09…