for_each函數原形算法
1 template<class _InIt, class _Fn1> inline 2 3 _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func) 4 5 { // perform function for each element 6 7 for (; _First != _Last; ++_First) 8 9 _Func(*_First); 10 11 return (_Func); 12 13 }
頭文件:函數
<algorithm>學習
說明:spa
for_each 算法範圍 [_First, _ Last) 中的每一個元素調用函數_Fn1,並返回輸入的參數 _Func。此函數不會修改序列中的任何元素。指針
用於刪除std::list指針類型元素變量code
STL標準模板庫,容器類只負責管理容器元素自己,包括類對象或者指針類型變量;對於指針類型元素,STL容器類不會管理元素的內存分配及釋放內存問題,請看如下一小段代碼:orm
// 定義用戶列表對象
std::list<CUserInfo*> m_users;blog
// 添加元素內存
CUserInfo * user1 = new CUserInfo();
m_users.push_back(user1);
// ...
// 清空
m_users.clear();
請注意,當調用users .clear()以後,將會致使程序內存泄露。
做爲一個合格的程序,你當即就會想到如下方法:
1 std::list<CUserInfo*>::iterator iter; 2 3 for (iter=m_users.begin(); iter!=m_users.end(); iter++) 4 5 { 6 7 delete *iter; 8 9 }
以上代碼怎麼看都不怎麼順眼,咱們能夠利用for_each算法函數實現相似功能:
先定義一個結構模板,用於刪除模板對象的指針,代碼以下:
1 struct DeletePtr 2 3 { 4 5 template<typename T> 6 7 void operator() (const T* ptr) const 8 9 { 10 11 if (ptr) 12 13 delete ptr; 14 15 } 16 17 };
而後修改前面的for()循環,代碼以下:
for_each(m_users.begin(),m_users.end(), DeletePtr());
m_users.clear();
最重要一點,定義了DeletePtr結構模板後,能夠在不一樣的項目中重用。
如何應用於std::map中
講到這裏,有些人可能開始有點不耐煩了,下面就直接給出代碼:
1 struct DeletePair 2 3 { 4 5 template<typename Ty1, typename Ty2> 6 7 void operator() (const std::pair<Ty1, Ty2> &ptr) const 8 9 { 10 11 if (ptr.second) 12 13 delete ptr.second; 14 15 } 16 17 };
std::map跟std::list處理不同,如下代碼演示瞭如何在std::map中使用該模板:
// 定義用戶列表
std::map<long, CUserInfo*> m_users;
// 清空
for_each(m_users.begin(), m_users.end(), DeletePair());
m_users.clear();
總結
提供的DeletePtr和DeletePair結構模板,只是用於刪除內存,功能並不強大;只是但願經過這二個例子,讓讀者能夠學習到如何利用for_each實現更多的事情,好比循環調用某個類成員函數