for_each()

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實現更多的事情,好比循環調用某個類成員函數

本站公眾號
   歡迎關注本站公眾號,獲取更多信息