zoukankan      html  css  js  c++  java
  • 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实现更多的事情,比如循环调用某个类成员函数

  • 相关阅读:
    字节面试:谈谈索引为什么能提高查询性能?
    阿里云服务器(ECS)上搭建rocketmq
    如何在 CentOS 8 上安装 Apache Maven
    147 01 Android 零基础入门 02 Java面向对象 07 Java多态 05 接口(重点)05 关于多接口中重名默认方法处理的解决方案
    146 01 Android 零基础入门 02 Java面向对象 07 Java多态 05 接口(重点)04 接口成员--默认方法 & 静态方法
    145 01 Android 零基础入门 02 Java面向对象 07 Java多态 05 接口(重点)03 接口成员--抽象方法&常量
    tcp循环发消息
    tcp基本语法
    界面开发控件DevExpress WPF开发指南
    高性能H5/JS开发框架DevExtreme 2021新版首发
  • 原文地址:https://www.cnblogs.com/zenseven/p/4178193.html
Copyright © 2011-2022 走看看