pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

C++ 仿函數使用講解

這篇文章主要介紹了C++ 仿函數使用講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

一、問題

先考慮一個簡單的例子:假設有一個vector<string>,你的任務是統計長度小于 5 的string的個數,如果使用count_if函數的話,你的代碼可能長成這樣:


 
//統計長度小于5的string的個數
 bool LengthIsLessThanFive(const string& str) {
      return str.length()<5;    
 }

int main()
 {	
         vector<string> vec = { "asdd","asddsa","dssa","asd" };
	 int res1 = count_if(vec.begin(), vec.end(), LengthIsLessThanFive);
}

其中count_if函數的第三個參數是一個函數指針,返回一個bool類型的值。

一般的,如果需要將任意長度的參數也傳入的話,我們可能將函數寫成這樣:


//統計長度小于len的string的個數
 bool LengthIsLessThanFive(const string& str, int len) {
      return str.length()< len;
 }

這個函數看起來比前面一個版本更具有一般性,但是它不能滿足count_if函數的參數要求:

count_if要求的是僅帶有一個參數的函數指針作為它的最后一個參數,編譯器會報錯

所以問題來了,怎么樣找到以上兩個函數的一個折中的解決方案呢?

二、一般的解決方案

我們考慮用一個全局變量


 int maxLength=5;
 
 //統計長度小于len的string的個數
 bool LenthIsLessThanCustom(const string& str) {
	     return str.length() < maxLength;
	 
 }

 這段代碼看似很不錯,實則不符合規范,更重要的是,它不優雅。原因有以下幾點要考慮:

1、容易出錯;

  為什么這么說呢,我們必須先初始化maxLength的值,才能繼續接下來的工作,如果我們忘了,則可能無法得到正確答案。此外,變量maxLength和函數LengthIsLessThan之間是沒有必然聯系的,編譯器無法確定在調用該函數前是否將變量初始化,給碼農平添負擔。

2、沒有可擴展性;

  如果我們每遇到一個類似的問題就新建一個全局變量,尤其是多人合作寫代碼時,很容易引起命名空間污染(namespace polution)的問題;當范圍域內有多個變量時,我們用到的可能不是我們想要的那個。

3、全局變量的問題;

  每當新建一個全局變量,即使是為了coding的便利,我們也要知道我們應該盡可能的少使用全局變量,因為它的cost很高;而且可能暗示你這里有一些待解決的優化方案。

三、新的解決方案——仿函數

如果我們不用全局變量,改如何解決這個問題?

先來看仿函數的通俗定義:

仿函數(functor)又稱為函數對象(function object)。是一個能行使函數功能的類。仿函數的語法幾乎和我們普通的函數調用一樣,不過作為仿函數的類,都必須重載operator()運算符,舉個例子:


class Func {
public:
   void operator() (const string& str) const {
	cout << str << endl;
   }
 
};

int main()
{
    Func myFunc;
    myFunc("helloworld!");
}

仿函數其實是使用成員函數的方式解決這個問題,因為成員函數可以很自然的訪問成員變量

所以,對count_if問題


 
struct ShorterThan {
 public:
	 explicit ShorterThan(int maxLength) : length(maxLength) {}
	 bool operator() (const string& str) const {
		 return str.length() < length;
 
	 }
 private:
	 const int length;
 
 };
;
 
 int main()
 {
	
 
	 vector<string> vec = { "asdd","asddsa","dssa","asd" };
	 int res3 = count_if(vec.begin(), vec.end(), ShorterThan(5));
	 cout << res3 << endl;
}

另一個例子,比較大小


 template<typename T> struct comp
 {
	 bool operator()(T in1, T in2) const
	 {
		 return (in1 > in2);
	 }
 };
 
 
 int main()
 {
    comp<int> m_comp_objext;
    cout << m_comp_objext(6, 3) << endl;     //一、使用對象調用
    cout << comp<int>()(6, 3) << endl;       //二、使用臨時對象
    return 0;
}

解釋:其中第一種用法比較為大家所熟悉。 comp<int> m_comp_objext的意思是產生一個名為m_comp_objext的對象,m_comp_objext(6,3)則是調用其 operator(),并給予兩個參數6,3。第二種用法中的 comp<int>()意思是產生一個臨時(無名的)對象,之后的(6,3)才是指定兩個參數6,3。

參考:

https://blog.csdn.net/u013049912/article/details/84988027

https://blog.csdn.net/coolwriter/article/details/81533226

到此這篇關于C++ 仿函數使用講解的文章就介紹到這了,更多相關C++ 仿函數使用內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要介紹了++ 設計模式的基本原則,主要的目標是實現最終目的,高內聚,低耦合,開放封閉原則類的改動是通過增加代碼進行的,感興趣的小伙伴可參考下面文章的具體內容
這篇文章主要介紹了C++基于OpenCV手勢識別的實現源碼,這里用到背景減法模型知識,具體實例代碼跟隨小編一起看看吧
下面小編就為大家帶來一篇深入理解c++指針的指針和指針的引用。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
C++ 提供了異常機制,讓我們能夠捕獲運行時錯誤,本文就詳細的介紹了C++異常處理入門,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要給大家介紹了關于C/C++中的內存模型和名稱空間詳解,文中通過示例代碼介紹的非常詳細,對大家學習或者使用c/c++具有一定的參考學習價值,需要的朋友們下面隨著小編來
推箱子想必是很多人童年時期的經典游戲,我們依舊能記得抱個老人機娛樂的場景,下面這篇文章主要給大家介紹了關于如何利用c++寫一個簡單的推箱子小游戲的相關資料,需要的朋友可以
主站蜘蛛池模板: 天津次氯酸钠酸钙溶液-天津氢氧化钠厂家-天津市辅仁化工有限公司 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 菏泽知彼网络科技有限公司 | 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 活动策划,舞台搭建,活动策划公司-首选美湖上海活动策划公司 | 滑石粉,滑石粉厂家,超细滑石粉-莱州圣凯滑石有限公司 | 二次元影像仪|二次元测量仪|拉力机|全自动影像测量仪厂家_苏州牧象仪器 | 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | 长春网站建设,五合一网站设计制作,免费优化推广-长春网站建设 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 土壤养分检测仪_肥料养分检测仪_土壤水分检测仪-山东莱恩德仪器 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 上海诺狮景观规划设计有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 金属雕花板_厂家直销_价格低-山东慧诚建筑材料有限公司 | 馋嘴餐饮网_餐饮加盟店火爆好项目_餐饮连锁品牌加盟指南创业平台 | 合肥钣金加工-安徽激光切割加工-机箱机柜加工厂家-合肥通快 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 匀胶机旋涂仪-声扫显微镜-工业水浸超声-安赛斯(北京)科技有限公司 | 万师讲师网-优质讲师培训师供应商,讲师认证,找讲师来万师 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 万濠投影仪_瑞士TRIMOS高度仪_尼康投影仪V12BDC|量子仪器 | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 礼堂椅厂家|佛山市艺典家具有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 神马影院-实时更新秒播| 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 包塑丝_高铁绑丝_地暖绑丝_涂塑丝_塑料皮铁丝_河北创筹金属丝网制品有限公司 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | 电池高低温试验箱-气态冲击箱-双层电池防爆箱|简户百科 | 华中线缆有限公司-电缆厂|电缆厂家|电线电缆厂家 | 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 上海公众号开发-公众号代运营公司-做公众号的公司企业服务商-咏熠软件 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 合肥制氮机_合肥空压机厂家_安徽真空泵-凯圣精机 |