首页 > 代码库 > for_each()

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>

说明:

for_each 算法范围 [_First, _ Last) 中的每个元素调用函数_Fn1,并返回输入的参数 _Func。此函数不会修改序列中的任何元素。

用于删除std::list指针类型元素变量

STL标准模板库,容器类只负责管理容器元素本身,包括类对象或者指针类型变量;对于指针类型元素,STL容器类不会管理元素的内存分配及释放内存问题,请看以下一小段代码:

     // 定义用户列表

     std::list<CUserInfo*> m_users;

 

     // 添加元素

     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实现更多的事情,比如循环调用某个类成员函数

for_each()