第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

C++用類封裝函數(shù)有什么好處么?

C++用類封裝函數(shù)有什么好處么?

瀟瀟雨雨 2019-04-19 16:11:23
看有的代碼可以用函數(shù)實(shí)現(xiàn),卻用類來(lái)封裝.具體例子是這樣:比如STL的list容器,sort的函數(shù)可以自定義一般這樣處理://comparison,notcasesensitive.boolcompare_nocase(stringfirst,stringsecond){unsignedinti=0;while((i
查看完整描述

2 回答

?
蕭十郎

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊

上面那種是functions,下面這種叫做functors.(我姑且翻譯成函子)
兩者最本質(zhì)的區(qū)別在于,上面僅僅是一個(gè)過(guò)程;而下面,卻可以包含狀態(tài)。后者,可以輕松實(shí)現(xiàn)閉包。
在C++11里面,后者直接演化為lambda了。
我就用你提到的sort來(lái)舉一個(gè)小例子:
cppboolmyfunction(inti,intj){return(i
structmyclass{
booloperator()(inti,intj){return(i}myobject;
std::vectormyvector{32,71,12,45,26,80,53,33};
std::sort(myvector.begin(),myvector.end(),myfunction);
std::sort(myvector.begin(),myvector.end(),myobject);
簡(jiǎn)化了你的例子,我們來(lái)關(guān)注本質(zhì)區(qū)別??雌饋?lái),好像等效對(duì)不?
那么現(xiàn)在需求變了,排序的時(shí)候,我只希望排值大于40的元素,請(qǐng)問(wèn)咋整,你說(shuō),只好把這個(gè)40寫(xiě)到函數(shù)里了。那如果我說(shuō)這個(gè)40是來(lái)自用戶輸入呢?也可能是50或是60,請(qǐng)問(wèn)怎么辦?
此時(shí),function好像有點(diǎn)沒(méi)有用武之地了。但我們的functor卻依然可以大顯身手。
cppstructmyclass{
intflag;
myclass(inti):flag(i){}
booloperator()(inti,intj){return((flag};
std::vectormyvector{32,71,12,45,26,80,53,33};
myclassmyobject(40);
std::sort(myvector.begin(),myvector.end(),myobject);
//output:3212263345537180
例子可能有點(diǎn)怪。。但你明白這意思了么?
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-19
?
MM們

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊

這個(gè)struct其實(shí)是functor,國(guó)內(nèi)譯成仿函數(shù),它的好處是可以保存狀態(tài)。
我舉個(gè)例子,你現(xiàn)在用compare_nocase的函數(shù)指針作為參數(shù),假如突然又有一個(gè)地方要求你比較字符串,但此時(shí)要求你忽略首字母,從第二個(gè)字符串開(kāi)始比較,那么你應(yīng)該怎么做?
1.要么你重新寫(xiě)一個(gè)compare_nocase2函數(shù),但會(huì)造成大量重復(fù)代碼。
2.要么你弄個(gè)intstart變量,然后放在compare_nocase的外面,在執(zhí)行我剛才說(shuō)的這個(gè)需求時(shí)候,先改變start=2,執(zhí)行完以后再把全局變量改回去。
可以看到,都不優(yōu)雅。
或許你想到了把compare_nocase寫(xiě)到一個(gè)類里,但這必須要是staticmethod。
而functor的解決很簡(jiǎn)單。
cppstructmylistSort{
intstart;
mylistSort(intp){start=p;}
booloperator()(stringfirst,stringsecond)const{
inti=start-1;
while((iif(tolower(first[i])++i;
}
if(first.length()elsereturnfalse;
}
};
這樣你從首字符開(kāi)始比較就可以mylist.sort(mylistSort(1));而當(dāng)你需要忽略首字符,從第二個(gè)字母開(kāi)始比較的時(shí)候就可以mylist.sort(mylistSort(2));
這樣就輕松避免了全局變量的狀態(tài)管理。
事實(shí)上functor還有很多其他好處,特別是配合template來(lái)寫(xiě),會(huì)發(fā)揮很大作用!
對(duì)了,C++11的話,可以這樣寫(xiě)
cppmylist.sort([](stringfirst,stringsecond){
//比較邏輯
});
C++14的話還能把它改成auto~~
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-19
  • 2 回答
  • 0 關(guān)注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)