最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 仿函數(shù)使用講解

 更新時(shí)間:2021年09月13日 11:02:30   作者:物隨心轉(zhuǎn)  
這篇文章主要介紹了C++ 仿函數(shù)使用講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

一、問題

先考慮一個(gè)簡(jiǎn)單的例子:假設(shè)有一個(gè)vector<string>,你的任務(wù)是統(tǒng)計(jì)長(zhǎng)度小于 5 的string的個(gè)數(shù),如果使用count_if函數(shù)的話,你的代碼可能長(zhǎng)成這樣:

 
//統(tǒng)計(jì)長(zhǎng)度小于5的string的個(gè)數(shù)
 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函數(shù)的第三個(gè)參數(shù)是一個(gè)函數(shù)指針,返回一個(gè)bool類型的值。

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

//統(tǒng)計(jì)長(zhǎng)度小于len的string的個(gè)數(shù)
 bool LengthIsLessThanFive(const string& str, int len) {
      return str.length()< len;
 }

這個(gè)函數(shù)看起來(lái)比前面一個(gè)版本更具有一般性,但是它不能滿足count_if函數(shù)的參數(shù)要求:

count_if要求的是僅帶有一個(gè)參數(shù)的函數(shù)指針作為它的最后一個(gè)參數(shù),編譯器會(huì)報(bào)錯(cuò)

所以問題來(lái)了,怎么樣找到以上兩個(gè)函數(shù)的一個(gè)折中的解決方案呢?

二、一般的解決方案

我們考慮用一個(gè)全局變量

 int maxLength=5;
 
 //統(tǒng)計(jì)長(zhǎng)度小于len的string的個(gè)數(shù)
 bool LenthIsLessThanCustom(const string& str) {
	     return str.length() < maxLength;
	 
 }

 這段代碼看似很不錯(cuò),實(shí)則不符合規(guī)范,更重要的是,它不優(yōu)雅。原因有以下幾點(diǎn)要考慮:

1、容易出錯(cuò);

  為什么這么說(shuō)呢,我們必須先初始化maxLength的值,才能繼續(xù)接下來(lái)的工作,如果我們忘了,則可能無(wú)法得到正確答案。此外,變量maxLength和函數(shù)LengthIsLessThan之間是沒有必然聯(lián)系的,編譯器無(wú)法確定在調(diào)用該函數(shù)前是否將變量初始化,給碼農(nóng)平添負(fù)擔(dān)。

2、沒有可擴(kuò)展性;

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

3、全局變量的問題;

  每當(dāng)新建一個(gè)全局變量,即使是為了coding的便利,我們也要知道我們應(yīng)該盡可能的少使用全局變量,因?yàn)樗腸ost很高;而且可能暗示你這里有一些待解決的優(yōu)化方案。

三、新的解決方案——仿函數(shù)

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

先來(lái)看仿函數(shù)的通俗定義:

仿函數(shù)(functor)又稱為函數(shù)對(duì)象(function object)。是一個(gè)能行使函數(shù)功能的類。仿函數(shù)的語(yǔ)法幾乎和我們普通的函數(shù)調(diào)用一樣,不過(guò)作為仿函數(shù)的類,都必須重載operator()運(yùn)算符,舉個(gè)例子:

class Func {
public:
   void operator() (const string& str) const {
	cout << str << endl;
   }
 
};
int main()
{
    Func myFunc;
    myFunc("helloworld!");
}

仿函數(shù)其實(shí)是使用成員函數(shù)的方式解決這個(gè)問題,因?yàn)槌蓡T函數(shù)可以很自然的訪問成員變量

所以,對(duì)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;
}

另一個(gè)例子,比較大小

 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;     //一、使用對(duì)象調(diào)用
    cout << comp<int>()(6, 3) << endl;       //二、使用臨時(shí)對(duì)象
    return 0;
}

解釋:其中第一種用法比較為大家所熟悉。 comp<int> m_comp_objext的意思是產(chǎn)生一個(gè)名為m_comp_objext的對(duì)象,m_comp_objext(6,3)則是調(diào)用其 operator(),并給予兩個(gè)參數(shù)6,3。第二種用法中的 comp<int>()意思是產(chǎn)生一個(gè)臨時(shí)(無(wú)名的)對(duì)象,之后的(6,3)才是指定兩個(gè)參數(shù)6,3。

參考:

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

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

到此這篇關(guān)于C++ 仿函數(shù)使用講解的文章就介紹到這了,更多相關(guān)C++ 仿函數(shù)使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

肃南| 商都县| 五家渠市| 衡水市| 青川县| 吴堡县| 云阳县| 大冶市| 牙克石市| 铁岭市| 临安市| 芦溪县| 天气| 黄冈市| 隆昌县| 清苑县| 黔江区| 中方县| 平陆县| 岗巴县| 谢通门县| 广宁县| 班玛县| 天峨县| 高清| 兖州市| 甘谷县| 咸宁市| 黔西| 阳江市| 新余市| 申扎县| 泾阳县| 澳门| 承德市| 景宁| 含山县| 汕尾市| 石泉县| 宁波市| 龙江县|