for_each()
2014-12-22 14:47
120 查看
for_each函数原形
头文件:
<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()之后,将会导致程序内存泄露。
作为一个合格的程序,你立即就会想到以下方法:
以上代码怎么看都不怎么顺眼,我们可以利用for_each算法函数实现类似功能:
先定义一个结构模板,用于删除模板对象的指针,代码如下:
然后修改前面的for()循环,代码如下:
for_each(m_users.begin(),m_users.end(), DeletePtr());
m_users.clear();
最重要一点,定义了DeletePtr结构模板后,可以在不同的项目中重用。
如何应用于std::map中
讲到这里,有些人可能开始有点不耐烦了,下面就直接给出代码:
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实现更多的事情,比如循环调用某个类成员函数
template<class _InIt, class _Fn1> inline _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func) { // perform function for each element for (; _First != _Last; ++_First) _Func(*_First); return (_Func); }
头文件:
<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()之后,将会导致程序内存泄露。
作为一个合格的程序,你立即就会想到以下方法:
std::list<CUserInfo*>::iterator iter; for (iter=m_users.begin(); iter!=m_users.end(); iter++) { delete *iter; }
以上代码怎么看都不怎么顺眼,我们可以利用for_each算法函数实现类似功能:
先定义一个结构模板,用于删除模板对象的指针,代码如下:
struct DeletePtr { template<typename T> void operator() (const T* ptr) const { if (ptr) delete ptr; } };
然后修改前面的for()循环,代码如下:
for_each(m_users.begin(),m_users.end(), DeletePtr());
m_users.clear();
最重要一点,定义了DeletePtr结构模板后,可以在不同的项目中重用。
如何应用于std::map中
讲到这里,有些人可能开始有点不耐烦了,下面就直接给出代码:
struct DeletePair { template<typename Ty1, typename Ty2> void operator() (const std::pair<Ty1, Ty2> &ptr) const { if (ptr.second) delete ptr.second; } };
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实现更多的事情,比如循环调用某个类成员函数
相关文章推荐
- Calculate every items’ quantity for each transaction type
- powerpivot 2013 已超出每个用户的最大允许会话数 The maximum numberof allowed sessions for each user has exceeded
- 现代C++ 基于范围的for和for_each语句
- Java for LeetCode 116 Populating Next Right Pointers in Each Node
- 禁用全部表的外键 sp_msforeachtable
- list、map、set、for-each、Iterator综合练习1
- list_for_each 详解
- c++ for_each 用法
- Ruby中for和each的比较
- C++中transform和for_each的实现
- sp_MSforeachtable使用方法
- 前端性能优化:jquery的each为什么比原生的for循环慢很多?
- php数组的遍历讲解 for foreach list each key
- C++ STL 学习 :for_each与仿函数(functor)
- forEach 和 forEachOrdered在Java 8 Stream的区别
- 【C++ STL学习之六】STL算法之for_each
- stl for_each某种用法
- Select a frequency/intensity level for each Apple content description iTunes Connect error
- js中for in 和 for each in的使用
- STL fill()填充算法以及for_each()算法 取容器中的最大最小值min_element,max_element