现在的位置: 首页 > 综合 > 正文

函数对象

2014年03月13日 ⁄ 综合 ⁄ 共 927字 ⁄ 字号 评论关闭
定义了调用操作符(即:())的类,其对象称为函数对象,即它们是行为类似函数的对象。
下面是函数对象的几个用法:
1)将函数对象用于标准库算法
函数对象经常用作通用算法的实参。下面的问题就是这样一个例子。分析一组故事中的单词,计算有多少个单词长度在 6 字符以上。该解决方案的一个部分包括定义一个函数以确定给定 string 的长度是否大于 6
字符:
// determine whether a length of a given word is 6 or more
   
bool GT6(const string &s)
   
{
       
return s.size() >= 6;
     }

使用 GT6 作为传给 count_if 算法的实参,以计算使 GT6 返回 true 的单词的数目:

vector<string>::size_type wc =
count_if(words.begin(), words.end(), GT6);这是传递函数指针的用法。
函数对象可以比函数更灵活:我们的实现有个严重问题:它将 6 这个数字固化在 GT6 函数的定义中。count_if 算法运行只用一个形参且返回
bool 的函数。理想情况下,应传递 string
和我们想要的长度进行测试。通过该方式,可以使用同一代码对不同长度的字符串进行计数。

通过将 GT6 定义为带函数调用成员类,可以获得所需的灵活性。将这个类命名为 GT_cls
以区别于函数:

     // determine whether a length of a given word is longer than a stored bound
class GT_cls {
public:
GT_cls(size_t val = 0): bound(val) { }
bool operator()(const string &s)
{ return s.size() >= bound; }
private:
std::string::size_type bound;
};

可以像前面一样进行计数,但这一次使用 GT_cls 类型的对象而不是 GT6
函数:

cout << count_if(words.begin(), words.end(), GT_cls(6))
<< " words 6 characters or longer" << endl;
当想改变比较的长度时,只有传入对于的值就可以,而不要修改代码。



抱歉!评论已关闭.