网亚机房管理软件博客

新实用主义典范

机房内存管理删除

假设有一个范围的元素,要机房内存管理删除满足某特定条件的元素,你可能向导的第一个解决方案是查看文档,确定容器是否有eraseO方法,然后迭代所有元素,并对每个满足条件的元素调用eraseO,这个方案的效率非常低下,因为保存vector在内存中的连续性,会涉及很多内存操作,因而得到平方复杂度。这个解决方案还容易产生错误,因为必须非常小心地确保每次调用eraseO之后迭代器依然有效,这个问题的正确解决方案是“删除-擦除法”。

算法只能访问迭代器抽象,不能访问容器。因此删除算法不能真正地从底层容器中删除元素,而是用匹配给定值或谓词的元素替换为下一个不匹配给定值或谓词的元素。结果是将集合分为两个集合:一个用于保存要保留的元素,另一个保存要删除的元素。如果真的需要从容器中杉树这些元素,必须先使用removeO算法,然后调用容器的eraseO方法,将从返回的迭代器到范围尾部的所有元素删除。这就是删除-擦除法。

机房关联函数对象

在类中,可以重载机房关联函数调用运算符,使类的对象可以取代机房关联函数指针。这些对象称为函数对象(function object),或称为仿函数(functor)。

很多STL算法,例如find ifO以及accumulateO的第二种形式,要求传入函数指针作为一个参数。在使用这些函数时,可以传入仿函数而非lambda或函数指针。C++提供一些预定义的仿函数类,这些类定义在functional头文件中,执行最常用的回调操作。

仿函数类通常由简单的一行表达式组成。如果必须创建机房关联函数或仿函数类,并指定一个不与其他名称冲突的名称,则使用该名称会带来很大的思维负担,其实其概念非常简单。在此类情况下,过lambda表达式表示的匿名(未命名)函数可以带来极大的方便。Lambda表达式的语法更简单,代码也更容易理解。

«1»

Powered By Z-Blog 2.0 Doomsday Build 121221

版权所有©2007-2013 南京网亚计算机有限公司
QQ:502800066(购买咨询) 1074187861(技术支持) 邮件: sales@ji-fang.cn
电话:( 025)84533318 (025)84533319 (025)66671103 13913982176 传真: (025)84533320
地址: 江苏省南京市中山东路198号龙台国际大厦1205室