日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL中mem_fun与mem_fun_ref的区别[转]

發布時間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL中mem_fun与mem_fun_ref的区别[转] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STL中mem_fun和mem_fun_ref的用法

分類:?C++?5244人閱讀?評論(8)?收藏?舉報

??? 怎么對容器中的所有對象都進行同一個操作?我們可能首先想到的是用循環來實現。
??? 比如有如下的一個類:

classClxECS
{
public:
????intDoSomething()?
????{?
????????//這里以輸出一句話來代替具體的操作
cout?<<"Output?from?method?DoSomething!"<<endl;?
????????return0;?
????};
};

???? 現在定義如下一個vector:

vector<ClxECS*>vECS;

for(inti?=0;?i?<13;?i++)
{
????ClxECS?*pECS?=newClxECS;
????vECS.push_back(pECS);
}

??? 如果要對容器vECS中的所有對象都進行DoSomething()的操作,那么下面的循環可能是首先想到的方案:

for(inti?=0;?i?<vECS.size();?i++)
????vECS.at(i)->DoSomething();

??? 當然,我們也可以用iterator:

for(vector<ClxECS*>::iterator?it?=vECS.begin();?it?!=vECS.end();?++it)
????(*it)->DoSomething();

??? 但是,有很多C++的高手和牛人們都會給我們一個忠告,那就是:在處理STL里面的容器的時候,盡量不要自己寫循環。
??? 那么,我們就只好用STL算法里面的for_each了。
??? 首先,添加如下一個函數:

intDoSomething(ClxECS?*pECS)
{
????returnpECS->DoSomething();
}

??? 然后就可以用for_each來實現我們想要的功能:

for_each(vECS.begin(),?vECS.end(),?&DoSomething);

??? 說了半天,似乎跟mem_funmem_fun_ref沒有什么關系。其實,說那么多都是為了引出mem_funmem_fun_ref。在用for_each的時候,如果我們不添加上面的那個函數,該怎么辦呢?
??? 這個時候就該mem_funmem_fun_ref隆重登場了。用如下這一行代碼就行了:

for_each(vECS.begin(),?vECS.end(),?mem_fun(&ClxECS::DoSomething));

??? 不用我多說,大家應該已經明白mem_fun是干什么和該怎么用的了。
????mem_fun_ref的作用和用法跟mem_fun一樣,唯一的不同就是:當容器中存放的是對象實體的時候用mem_fun_ref,當容器中存放的是對象的指針的時候用mem_fun。

轉載于:https://www.cnblogs.com/Purple_Xiapei/archive/2012/05/27/2520483.html

總結

以上是生活随笔為你收集整理的STL中mem_fun与mem_fun_ref的区别[转]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。