妙用for_each算法函数
来源:互联网 发布:孙叔公的淘宝店 编辑:程序博客网 时间:2024/05/18 00:20
for_each函数原形
template<class _InIt,
class _Fn1> inline
_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{ // perform function for each element
for (; _ChkFirst != _ChkLast; ++_ChkFirst)
_Func(*_ChkFirst);
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实现更多的事情,比如循环调用某个类成员函数(下次提供源码例子)等。
- 妙用for_each算法函数
- 妙用for_each算法函数
- 妙用for_each算法函数
- 妙用for_each算法函数
- for_each算法函数
- for_each算法函数
- for_each算法
- 算法 for_each
- for_each()算法
- for_each算法
- for_each函数
- C++ for_each函数\for_each模板
- 泛型算法 for_each()
- STL运算算法-for_each()
- C++ STL 算法:for_each
- STL算法------for_each
- for_each()算法的使用
- STL算法之for_each
- C++ stringstream介绍,使用方法与例子
- AutoCompleteTextView (自动完成输入框自动提示功能的菜单)
- C/C++ 文件读写操作总结
- 让putty支持中文
- Spring AOP 的关键概念
- 妙用for_each算法函数
- 日语在线翻译和日语在线词典网站
- 从Coding Fan到真正的技术专家
- delphi计算时间差
- 最短路径的Floyd与Dijkstra算法
- “你的代码写的很烂”
- 依赖、依赖倒转原则、IoC/依赖注入、以及在Spring中的实现
- java基础--12
- POJ 2663 Heavy Cargo & ZOJ 1952 Heavy Cargo