中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中仿函數怎么用

發布時間:2021-09-13 12:54:36 來源:億速云 閱讀:104 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“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要求的是僅帶有一個參數的函數指針作為它的最后一個參數,編譯器會報錯

C++中仿函數怎么用

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

二、一般的解決方案

我們考慮用一個全局變量

 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;
}

C++中仿函數怎么用

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

以上是“C++中仿函數怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

阿坝| 成安县| 胶州市| 甘德县| 宁河县| 巩义市| 全州县| 玉门市| 安仁县| 土默特左旗| 丹东市| 尚义县| 江达县| 义乌市| 冕宁县| 凌海市| 广德县| 工布江达县| 新密市| 金川县| 本溪| 平陆县| 蒙阴县| 石屏县| 克东县| 宁远县| 瓮安县| 九寨沟县| 托里县| 鹤壁市| 黔西县| 云阳县| 大余县| 曲周县| 顺平县| 富民县| 汾阳市| 曲水县| 神池县| 延津县| 陆丰市|