學習使用mem_fun、mem_fun_ref函數

提出問題算法

有一個用戶信息類CUserInfo,包括一個類成員函數initdata(用於初始化用戶數據),代碼以下:
class CUserInfo
{
public:
void initdata(void)
{
// ...
}
};
假設有一個列表存放全部的用戶數據:
std::list<CUserInfo> userlists;
咱們須要按期的對userlists的全部用戶作一次初始化操做,也便是調用類成員函數CUserInfo::initdata;
普通利用for循環實現要求
正常來說,不少人(包括我在內)可能第一時間會想到使用for循環,下面給出例子代碼;
std::list<CUserInfo>::iterator iter;
for (iter=userlists.begin(); iter!=userlists.end(); iter++)
{
(*iter).initdata();
}
使用for循環確實能夠實現要求,但不少C++專家、編程手冊和歷史經驗告訴咱們,「在處理STL容器的時候,儘可能不要本身寫循環;」「算法函數優先使用於循環;」「…」
一樣我也推薦使用下面的std::for_each和std::mem_fun_ref方案。
使用std::mem_fun_ref函數
利用std::for_each和std::mem_fun_ref一樣能夠實現咱們想要的功能,代碼以下:
for_each(userlists.begin(), userlists.end(), std::mem_fun_ref(&CUserInfo::initdata));
「什麼?」「不可能!」「只有一行代碼?」
「是的,沒錯!」「只有一行代碼。」
使用std::mem_fun函數
或許有些人會問,那mem_fun怎麼用?用在哪裏?
而有些人會問,若是我是存的CUserInfo*,怎麼處理?
其實大家問的也就是下面我要給出的這段代碼,解決的問題;
std::list<CUserInfo*> userlists;
for_each(userlists.begin(), userlists.end(), std::mem_fun(&CUserInfo::initdata));
總結
std::mem_fun和std::mem_fun_ref所實現的是相同的功能,能夠這麼理解之間的差別,mem_fun用於處理容器對象指針,而mem_fun_ref用於處理容器對象實體。編程

相關文章
相關標籤/搜索