C++PrimerPlus(第6版)中文版:Chapter16.5.1函数对象_函数符概念

STL函数对象应用实例
本文介绍了STL中函数对象的概念及其应用场景,通过一个具体的C++示例代码展示了如何使用函数对象进行数据过滤,并解释了谓词、一元和二元函数等概念。

很多STL算法都使用函数对象(也叫函数符functor)函数符是可以以函数方式与()结合使用的任意对象。

STL也定义了函数符概念

  • 生成器:是不用参数就可以调用的函数符
  • 一元函数:是用一个参数可以调用的函数符
  • 二元函数:是用两个参数可以调用的函数符
  • 谓词:返回bool值的一元函数是谓词
  • 二元谓词:返回bool值的二元函数是二元谓词

 list模板有一个将谓词作为参数的remove_if()成员,该函数将谓词应用于区间中的每一个元素,如果谓词返回true,则删除这些元素。

可以设计一个类,这个类初始化为不同的数值,来供remove_if()调用。具体请看例子代码:

// functor.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>

template<class T>//functor class defines operator()()
class TooBig
{
private:
    T cutoff;
public:
    TooBig(const T &t):cutoff(t){}
    bool operator()(const T& v) { return v > cutoff; }
};
void outint(int n) { std::cout << n << "  "; }

int main()
{
    //std::cout << "Hello World!\n";
    using std::list;
    using std::cout;
    using std::endl;

    TooBig<int>f100(100);//limit=100
    int vals[10] = { 50,100,90,180,60,210,415,88,188,201 };
    list <int> yadayada(vals,vals+10);//range conctor
    list<int> etcetera(vals,vals+10);
    //c++11 can use following instead
    //list <int> yadayada={50,100,90,180,60,210,415,88,188,201 }
    //list <int> etcetera={50,100,90,180,60,210,415,88,188,201 }
    cout << "Original lists:\n";
    for_each(yadayada.begin(),yadayada.end(),outint);
    cout << endl;
    for_each(etcetera.begin(), etcetera.end(), outint);
    cout << endl;

    yadayada.remove_if(f100);//use a named function object 使用一个命名的函数对象
    etcetera.remove_if(TooBig<int>(200));//construct a function object 使用匿名的函数对象
    cout << "Trimed Lists:\n";
    for_each(yadayada.begin(), yadayada.end(), outint);
    cout << endl;
    for_each(etcetera.begin(), etcetera.end(), outint);
    cout << endl;
    return 0;
} 


运行结果:(大于100的被删除了,大于200的也删除了)这就是个过滤呗,挺好啊这想法。

Original lists:
50  100  90  180  60  210  415  88  188  201
50  100  90  180  60  210  415  88  188  201
Trimed Lists:
50  100  90  60  88
50  100  90  180  60  88  188

16.5.2预定义的函数符 

STL定义了多个基本函数符,它们执行诸如将两个数相加,比较两个值是否相等等操作。提供这些函数符是为了支持将函数作为参数的STL函数。例如考虑transform()函数,它有两个版本。咱们就说第一个版本。接受四个参数,前两个参数是指定容器区间的迭代器,第三个参数是指定结果放入到哪里的迭代器,第四个就是函数符,它应用于区间的每一个元素,生成结果中的新元素。这个说白了就是指明了:你要对谁做运算?(参数一,参数二来决定)算完了放哪里呢?(参数三来决定)怎么算 ?(参数4的函数符来决定,可以是开平方根,比较大小等)。这就是函数符的用武之地了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值