在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

引入仿函數(shù)(functor)原因

Q4MP_gh_c472c21 ? 來源:dnbc66 ? 作者:dnbc66 ? 2020-11-16 16:49 ? 次閱讀

【導(dǎo)讀】:在我們?nèi)粘>幋a中會(huì)發(fā)現(xiàn)有些功能代碼,會(huì)不斷的在不同的成員函數(shù)中用到,但是又不好將這些代碼獨(dú)立成一個(gè)成員函數(shù)。解決辦法之一就是寫一個(gè)公共的函數(shù),不過函數(shù)用到的一些變量,就可能會(huì)成為全局變量。再說為了復(fù)用這么一段代碼,就要單立出一個(gè)函數(shù),也不是很好維護(hù)。此時(shí)就可以用到仿函數(shù)了。

以下是正文

引入仿函數(shù)(functor)原因

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

bool LengthIsLessThanFive(const string& str){returnstr.length()< 5;????}int res=count_if(vec.begin(), vec.end(), LengthIsLessThanFive);

其中count_if函數(shù)的第三個(gè)參數(shù)是一個(gè)函數(shù)指針,返回一個(gè)bool類型的值。一般的,如果需要將特定的閾值長(zhǎng)度也傳入的話,我們可能將函數(shù)寫成這樣:

bool LenthIsLessThan(const string& str, int len) {returnstr.length()< len;}

這個(gè)函數(shù)看起來比前面一個(gè)版本更具有一般性,但是他不能滿足count_if函數(shù)的參數(shù)要求:count_if要求的是unary function(僅帶有一個(gè)參數(shù))作為它的最后一個(gè)參數(shù)。所以問題來了,怎么樣找到以上兩個(gè)函數(shù)的一個(gè)折中的解決方案呢?

這個(gè)問題其實(shí)可以歸結(jié)于一個(gè)data flow的問題,要設(shè)計(jì)這樣一個(gè)函數(shù),使其能夠access這個(gè)特定的length值,回顧我們已有的知識(shí),有三種解決方案可以考慮:

(1)函數(shù)的局部變量:

局部變量不能在函數(shù)調(diào)用中傳遞,而且caller無法訪問。

(2)函數(shù)的參數(shù):

這種方法我們已經(jīng)討論過了,多個(gè)參數(shù)不適用于count_if函數(shù)。

(3)全局變量:

我們可以將長(zhǎng)度閾值設(shè)置成一個(gè)全局變量,代碼可能像這樣:

int maxLength;bool LengthIsLessThan(const string& str) { return str.length() < maxLength;}int res=count_if(vec.begiin(), vec.end(), LengthIsLessThan);

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

(1)容易出錯(cuò):

為什么這么說呢,我們必須先初始化maxLength的值,才能繼續(xù)接下來的工作,如果我們忘了,則可能無法得到正確答案。此外,變量maxLength和函數(shù)LengthIsLessThan之間是沒有必然聯(lián)系的,編譯器無法確定在調(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ù)(functor)介紹

說了這么多,還是要回到我們?cè)嫉哪莻€(gè)問題,有什么解決方案呢?答案當(dāng)然就是這篇blog的正題部分:仿函數(shù)。

我們的初衷是想設(shè)計(jì)一個(gè)unary function,使其能做binary function的工作,這看起來并不容易,但是仿函數(shù)能解決這個(gè)問題。

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

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

>>>helloworld!

仿函數(shù)其實(shí)是上述解決方案中的第四種方案:成員變量。成員函數(shù)可以很自然的訪問成員變量:

class StringAppend{ public: explicit StringAppend(const string& str) : ss(str){} void operator() (const string& str) const{ cout<

>>>hellois world

我相信這個(gè)例子能讓你體會(huì)到一點(diǎn)點(diǎn)仿函數(shù)的作用了;它既能像普通函數(shù)一樣傳入給定數(shù)量的參數(shù),還能存儲(chǔ)或者處理更多我們需要的有用信息

讓我們回到count_if的問題中去,是不是覺得問題變得豁然開朗了?

class ShorterThan { public: explicit ShorterThan(int maxLength) : length(maxLength) {} bool operator() (const string& str) const { return str.length() < length; } private: const int length;};//直接調(diào)用即可count_if(myVector.begin(), myVector.end(), ShorterThan(length));

這里需要注意的是,不要糾結(jié)于語法問題:ShorterThan(length)似乎并沒有調(diào)用operator()函數(shù)?其實(shí)它調(diào)用了,創(chuàng)建了一個(gè)臨時(shí)對(duì)象。你也可以自己加一些輸出語句看一看。

這篇博文就先記到這里了,仿函數(shù)也在STL中大量涉及到,不徹底弄懂仿函數(shù)的問題看到STL源碼就會(huì)一頭包。后續(xù)可能再分享一些關(guān)于functor的資料和個(gè)人學(xué)習(xí)心得。

責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4350

    瀏覽量

    63096
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2114

    瀏覽量

    73965
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4845

    瀏覽量

    69256

原文標(biāo)題:C++仿函數(shù)你會(huì)嗎?

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SUMIF函數(shù)與SUMIFS函數(shù)的區(qū)別

    SUMIF函數(shù)和SUMIFS函數(shù)都是Excel中用于條件求和的函數(shù),它們可以幫助用戶根據(jù)特定的條件對(duì)數(shù)據(jù)進(jìn)行求和。盡管它們的基本功能相似,但在使用場(chǎng)景和功能上存在一些差異。以下是對(duì)這兩個(gè)函數(shù)
    的頭像 發(fā)表于 10-30 09:51 ?1869次閱讀

    OPA615峰值保持電路仿真仿不出來是怎么回事?

    求助~仿了好幾天了,就是仿真不出來,輸出上升到峰值后,馬上下降了
    發(fā)表于 08-30 08:12

    面試常考+1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針和指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場(chǎng)景,對(duì)于提升嵌入式程序的效率和質(zhì)量至關(guān)重要。一、指針函數(shù)函數(shù)指針指針
    的頭像 發(fā)表于 08-10 08:11 ?1015次閱讀
    面試常考+1:<b class='flag-5'>函數(shù)</b>指針與指針<b class='flag-5'>函數(shù)</b>、數(shù)組指針與指針數(shù)組

    神經(jīng)元模型激活函數(shù)通常有哪幾類

    神經(jīng)元模型激活函數(shù)是神經(jīng)網(wǎng)絡(luò)中的關(guān)鍵組成部分,它們負(fù)責(zé)在神經(jīng)元之間引入非線性,使得神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)和模擬復(fù)雜的函數(shù)映射。以下是對(duì)神經(jīng)元模型激活函數(shù)的介紹: 一、Sigmoid
    的頭像 發(fā)表于 07-11 11:33 ?1188次閱讀

    在HTTP的demo里面,回調(diào)函數(shù)不執(zhí)行的原因

    在HTTP的demo里面,我用下面這個(gè)函數(shù)注冊(cè)了一個(gè)回調(diào)函數(shù),但是發(fā)現(xiàn)有時(shí)候正常執(zhí)行有時(shí)候不執(zhí)行,只是偶爾不執(zhí)行,大部分時(shí)間是正常的。有沒有人能提供一下原因可能的方向,謝謝!! espconn_regist_write_fin
    發(fā)表于 07-10 08:23

    BP神經(jīng)網(wǎng)絡(luò)激活函數(shù)怎么選擇

    中,激活函數(shù)起著至關(guān)重要的作用,它決定了神經(jīng)元的輸出方式,進(jìn)而影響整個(gè)網(wǎng)絡(luò)的性能。 一、激活函數(shù)的作用 激活函數(shù)是BP神經(jīng)網(wǎng)絡(luò)中神經(jīng)元的核心組成部分,其主要作用如下: 引入非線性:激活
    的頭像 發(fā)表于 07-03 10:02 ?841次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)激活函數(shù)的作用

    起著至關(guān)重要的作用,它們可以增加網(wǎng)絡(luò)的非線性,提高網(wǎng)絡(luò)的表達(dá)能力,使網(wǎng)絡(luò)能夠?qū)W習(xí)到更加復(fù)雜的特征。本文將詳細(xì)介紹卷積神經(jīng)網(wǎng)絡(luò)中激活函數(shù)的作用、常見激活函數(shù)及其特點(diǎn),以及激活函數(shù)在網(wǎng)絡(luò)優(yōu)化中的應(yīng)用。 一、激活
    的頭像 發(fā)表于 07-03 09:18 ?1307次閱讀

    神經(jīng)網(wǎng)絡(luò)中的激活函數(shù)有哪些

    在神經(jīng)網(wǎng)絡(luò)中,激活函數(shù)是一個(gè)至關(guān)重要的組成部分,它決定了神經(jīng)元對(duì)于輸入信號(hào)的反應(yīng)方式,為神經(jīng)網(wǎng)絡(luò)引入了非線性因素,使得網(wǎng)絡(luò)能夠?qū)W習(xí)和處理復(fù)雜的模式。本文將詳細(xì)介紹神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù),包括其定義、特點(diǎn)、數(shù)學(xué)形式以及在神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 07-01 11:52 ?706次閱讀

    如何在idf工程中引入mdf WiFi-Mesh函數(shù)

    我原先在idf下開發(fā)好的程序,如何引入mdf進(jìn)行開發(fā)?需要用到WiFi-Mesh,看了下mdf下的例程是比較合適的,而idf下的wifi-mesh例程很粗略,想把mdf中的例程移植到我原來的idf工程里面去
    發(fā)表于 06-28 14:59

    函數(shù)發(fā)生器的常見故障及解決方法

    函數(shù)發(fā)生器,作為電子測(cè)試和測(cè)量領(lǐng)域的重要工具,其穩(wěn)定性和可靠性對(duì)于實(shí)驗(yàn)和測(cè)試結(jié)果的準(zhǔn)確性至關(guān)重要。然而,由于各種原因函數(shù)發(fā)生器在使用過程中可能會(huì)遇到各種故障。本文將詳細(xì)介紹函數(shù)發(fā)生器
    的頭像 發(fā)表于 05-15 11:45 ?1173次閱讀

    函數(shù)信號(hào)發(fā)生器的常見故障及原因分析

    的應(yīng)用價(jià)值。然而,隨著使用時(shí)間的增長(zhǎng),函數(shù)信號(hào)發(fā)生器可能會(huì)出現(xiàn)各種故障,影響其正常工作。本文將對(duì)函數(shù)信號(hào)發(fā)生器進(jìn)行詳細(xì)介紹,并分析其常見故障及原因
    的頭像 發(fā)表于 05-10 16:13 ?1654次閱讀

    stm32中FREERTOS的延時(shí)函數(shù)osDelayUntil()死機(jī)的原因

    我在使用STM32F4跑freertos的時(shí)候發(fā)現(xiàn)一旦使用osDelayUntil()函數(shù),就會(huì)死機(jī),但是用osDelay()函數(shù)就不會(huì),按理說不是都可以用的嗎?有知道原因的嗎,謝謝!
    發(fā)表于 03-22 07:56

    回調(diào)函數(shù)(callback)是什么?回調(diào)函數(shù)的實(shí)現(xiàn)方法

    回調(diào)函數(shù)是一種特殊的函數(shù),它作為參數(shù)傳遞給另一個(gè)函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后被調(diào)用。回調(diào)函數(shù)通常用于事件處理、異步編程和處理各種操作系統(tǒng)和
    發(fā)表于 03-12 11:46 ?3256次閱讀

    函數(shù)指針與回調(diào)函數(shù)的應(yīng)用實(shí)例

    通常我們說的指針變量是指向一個(gè)整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)函數(shù)指針可以像一般函數(shù)一樣,用于調(diào)用函數(shù)、傳遞參數(shù)。
    的頭像 發(fā)表于 03-07 11:13 ?453次閱讀
    <b class='flag-5'>函數(shù)</b>指針與回調(diào)<b class='flag-5'>函數(shù)</b>的應(yīng)用實(shí)例

    verilog function函數(shù)的用法

    Verilog 是一種硬件描述語言 (HDL),主要用于描述數(shù)字電子電路的行為和結(jié)構(gòu)。在 Verilog 中,函數(shù) (Function) 是一種用于執(zhí)行特定任務(wù)并返回一個(gè)值的可重用代碼塊。函數(shù)
    的頭像 發(fā)表于 02-22 15:49 ?6197次閱讀
    主站蜘蛛池模板: 新版天堂资源在线官网8 | 夜夜摸天天操 | 朋友夫妇和交换性bd高清 | 久久久噜久噜久久gif动图 | 一级片在线视频 | 午夜视频免费在线观看 | 免费色视频在线观看 | 亚洲丝袜一区二区 | 久草五月 | 亚洲精品久 | 国产色婷婷精品综合在线手机播放 | 一区二区三区四区国产精品 | 九九国产精品 | 国产欧美日韩haodiaose | 国产视频日本 | 亚洲精品福利视频 | 亚洲精品福利网站 | 天天摸天天舔天天操 | 最近最新中文字幕在线第一页 | 色婷婷色综合激情国产日韩 | 欧美性白人极品1819hd | 二级黄绝大片中国免费视频0 | 特级一级全黄毛片免费 | 国产在线一卡 | aa在线视频 | 色婷婷精品综合久久狠狠 | 亚洲一本之道在线观看不卡 | 国产精品久久新婚兰兰 | 天天色天天色 | 色四月婷婷 | 特黄一级大片 | 视频在线观看免费播放www | 日本经典在线三级视频 | 最新亚洲人成网站在线影院 | 日韩污| 天天色综合1 | 美女毛片免费看 | 成人久久久 | 欧美尺寸又黑又粗又长 | 免免费看片 | 韩国三级久久精品 |