zoukankan      html  css  js  c++  java
  • 函数对象用于标准库

    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));

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

  • 相关阅读:
    C# 类型的创建
    C# 中4个访问符和8个修饰符详解
    C#命名空间详解namespace
    ContextMenuStrip 添加在窗体。点击右键不能显示问题解答
    C# 学习笔记 C#基础
    React-Navigation web前端架构
    Css animation 与 float 、flex 布局问题
    javaScript 工作必知(十一) 数组常用方法实现
    Vue 父子组件传值 props
    kafka 参数配置 1
  • 原文地址:https://www.cnblogs.com/hwm520hlf1314/p/3455973.html
Copyright © 2011-2022 走看看