C++STL:仿函数

C++仿函数应用实例

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

using namespace std;

template<class T>
struct GT
{
    GT (const T& a) : m_a(a) {}
    bool operator()(const T& left)
    {
        return left >= m_a;
    }
    T m_a;
};

int main()
{
    list<int> iLst;
    iLst.push_back(12);
    iLst.push_back(178);
    iLst.push_back(200);

    list<int>::iterator iter =
        find_if(iLst.begin(), iLst.end(), GT<int>(100));
    if (iLst.end() != iter)
    {
        cout << "find" << endl;
        cout << *iter << endl;
    }
    else
    {
        cout << "not find" << endl;
    }

    return 0;
}

函数指针调用与函数对象调用的等效性

#include <Windows.h>
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <list>
#include <algorithm>

using namespace std;

//*********************************************************
// 函数
//*********************************************************
bool GreaterThan(int left, int right)
{
    return left >= right;
}
typedef bool (*GreaterThanFuncPtrType)(int, int);

//*********************************************************
// 仿函数类
//*********************************************************
template<class T>
struct GT
{
    bool operator()(const T& left, const T& right) const
    {
        return left >= right;
    }
};

int main()
{
    list<int> iLst;
    iLst.push_back(10);
    iLst.push_back(110);
    iLst.push_back(120);

    //-----------------------------------------------------
    // 用函数指针调用
    //-----------------------------------------------------
    GreaterThanFuncPtrType pGreaterThan
        = GreaterThan;

    list<int>::iterator iter = iLst.begin();
    for(; iter != iLst.end(); ++iter)
    {
        cout << pGreaterThan(*iter, 100) << endl;
    }

    //-----------------------------------------------------
    // 用函数对象调用
    //-----------------------------------------------------
    GT<int> gt;
    iter = iLst.begin();
    for(; iter != iLst.end(); ++iter)
    {
        cout << gt(*iter, 100) << endl;
    }

    return 0;
}
时间: 2024-12-23 18:13:48

C++STL:仿函数的相关文章

[GeekBand] STL 仿函数入门详解

本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格  http://www.leavesite.com/ 前言:本文主要通过关联容器set解释下仿函数的实现及工作原理. 一.STL六大组件简介 1.Containers(容器):各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据2.Algorithms(算法):如. Sort,Search.3.Iterators(

stl仿函数和适配器

所谓的适配器就是底层利用仿函数,然后修改仿函数的接口,达到自己的目的: 例如:template<class operation> class binder1st的适配器,其本质是一个类,它的模板参数operation其实是仿函数类(仿函数其实是struct类),内部函数调用operator()(const typename Operation::second_argument_type& x) const,其中x是我们适配器调用的参数,由于此适配器的目的就是绑定第一个参数,使得我们的调

STL 仿函数(函数对象)

##定义 仿函数(functor):一种具有函数性质的对象. 仿函数在C++中的新名称为函数对象(function object). 仿函数类对象像函数一样被调用,调用仿函数类对象时,实际调用的是仿函数类中重载的operator()函数. 仿函数的主要用途是搭配STL算法. ##应用 STL的算法通常定义两个版本: 一种实现常用的功能,采用默认的处理方法. 另一种提供泛化能力,允许用户指定算法的比较准则,或者指定算法对容器中元素施加的"操作"等.这里的比较准则是算法中的一个模板参数.

STL标准库-仿函数

摘要: 摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 仿函数的实现:声明一个类,重载它的operator call ("()"操作符) template<typename T> class lineFeed { public: void operator()(const T &x) { cout<<x<<endl; } }; 仿函数只为算法服务,但是像上面这种声明方式,虽然在有些时候可以使用,但是却不

SGI STL functors(仿函数) 12

函数对象,即"行为类似函数"的对象,重载function call运算子(operator ()).STL仿函数根据操作数个数划分,可分为一元和二元仿函数,按功能划分可分为算数运算.关系运算.逻辑运算三大类.使用内建仿函数需包含<functional>头文件. 仿函数可配接的关键 为了拥有配接能力,需要依照规定定义自己的5个相应型别.仿函数的相应型别主要用来表现函数参数型别和传回值型别.为了方便期间,<stl_function.h>定义了两个class,分别表示

《STL源码剖析》——第七、八章:仿函数与接配器

第七章:仿函数  7.1.仿函数(函数对象)概观 STL仿函数的分类,若以操作数(operand)的个数划分,可分为一元和二元仿函数,若以功能划分,可分为算术运算(Arithmetic).关系运算(Rational).逻辑运算(Logical)三大类.任何应用程序欲使用STL内建的仿函数,都必须含人<functiona1>头文件,SGI则将它们实际定义于<st1_function.h>文件中.以下分别描述. 重载 () 所以函数的对象 使用()像函数调用 是类 而不是普通的函数 内

C++学习书籍推荐《C++标准库(第一版)》下载

百度云及其他网盘下载地址:点我 编辑推荐 <C++标准程序库:自修教程与参考手册>编辑推荐:C++标准程序库提供了一组通用类别(classes)和界面(interfaes),可大幅扩充C++核心语言.程序库本身无法不辩自明,为了完整运用其组件,并从其强大的威力中获得利益,你需要一份完善的资源,而非一份仅仅列出类别和函数的一般文件,它就是<C++标准程序库:自修教程与参考手册>. 媒体推荐 书评 C++标准程序库提供了一组通用类别(classes)和界面(interfaes),可大幅

C++ STL 学习 :for_each与仿函数(functor)

简单来将,仿函数(functor)就是一个重载了"()"运算符的struct或class,利用对象支持operator()的特性,来达到模拟函数调用效果的技术. 我们平时对一个集合类遍历的时候,例如vector,是这样做的: for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end(); ++iter) { //do your whatever you want here } 例如下面的代码:

STL C++ std::bind操作例子,仿函数操作配合算法库操作

1.stl::bind 和std::mem_fun_ref系列的配合使用出现了问题,多参形式不知道如何组织.适配器的操作真心难受!!!只能迷迷糊糊地用着.要使用非质变算法时需要作用于容器时只能考虑lambda或者transfer操作.待续 // functor-adapter_p431.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <algorithm>//元素操作算法 #include <functiona

STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数

 1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) Adaptors(配接器) STL的六大组件分别是: 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adapter) 空间配置器(allocator):只能分配内存等 2.容器与算法 案例如下: #include<