函数对象用于标准库

1、什么是函数对象?

   定义了调用操作符的类,其对象常成为函数对象,即他们是行为类型函数的对象。如下例子所示:

 1 struct absInt
 2 {
 3     int operator() (int val)
 4     {
 5         return val < 0 ? - val:val;
 6     }
 7 };
 8 
 9 int _tmain( int argc, char** argv )
10 {
11     int i = -42;
12     absInt absObj;
13     absObj(i);
14 
15     return 0;
16 }

2、函数对象用作算法的实参
   举下面一个例子:分析一组故事中的单词,计算有多少单词长度在6字符以上。该解决方案的一个部分包括定义一个函数已确定给的单词长度在6字符以上。

1 bool GT6(const string &s)
2 {
3     return s.size >= 6;
4 }

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

1 vector<string> words;
2 vector<string>::size_type wc = count_if(words.begin(),words.end(),GT6);

   我们发现将6这个数字固定在GT6函数定义中。count_if算法运行只用一个形参且返回bool的函数。理想情况下,我们应该传递我们想要的长度进行测试。通过函数对象方式,我们可以使用同意代码对不同长度的字符串进行计数。定义如下所示:

 1 class GT_cls
 2 {
 3 public:
 4     GT_cls(size_t val = 0):bound(val) {}
 5     bool operator() (const string &s)
 6     {
 7         return s.size >= bound;
 8     }
 9 
10 private:
11     size_t bound;
12 };

   我们可以向下面这样使用:

1 vector<string> words;
2 vector<string>::size_type wc = count_if(words.begin(),words.end(),GT_cls(6));

    这样我们就可随便计算有多少单词长度在字符以上了。

原文地址:https://www.cnblogs.com/hwm520hlf1314/p/3455973.html