仿函数和函数配接器

//
//  main.cpp
//  function_adaptor
//
//  Created by IDM-PKU on 14-9-3.
//  Copyright (c) 2014年 PKU. All rights reserved.
//

#include <iostream>
#include <set>
#include <deque>
#include <algorithm>
#include "print.hpp"

using namespace std;

int main(int argc, const char * argv[])
{

    set<int,greater<int> > coll1;
    deque<int> coll2;
    for (int i=1; i<=9; ++i) {
        coll1.insert(i);
    }
    PRINT_ELEMENTS(coll1,"initialized: ");
    transform(coll1.begin(), coll1.end(),back_inserter(coll2),bind2nd(multiplies<int>(), 10));
    PRINT_ELEMENTS(coll2);
    replace_if(coll2.begin(), coll2.end(), bind2nd(equal_to<int>(), 70), 42);
    PRINT_ELEMENTS(coll2,"replace: ");
    coll2.erase(remove_if(coll2.begin(), coll2.end(), bind2nd(less<int>(), 50)), coll2.end());
    PRINT_ELEMENTS(coll2,"removed: ");
    return 0;
}

  

//
//  print.hpp
//  function_adaptor
//
//  Created by IDM-PKUSZ on 14-9-3.
//  Copyright (c) 2014年 PKU. All rights reserved.
//

#ifndef function_adaptor_print_hpp
#define function_adaptor_print_hpp

#include <iostream>

template <class T>
inline void PRINT_ELEMENTS(const T & coll, const char * optcstr="")
{
    typename T::const_iterator pos;
    std::cout << optcstr;
    for(pos=coll.begin();pos!=coll.end();++pos)
        std::cout << *pos << ‘ ‘;
    std::cout << std::endl;
}

#endif

  透过一些特殊的函数配接器,你可以将预先定义的仿函数和其它数值组合在一起。

下面是在Mac OS下的运行结果:

时间: 2024-08-24 15:35:12

仿函数和函数配接器的相关文章

C++函数配接器

一.概述 配接器(adaptor)在STL组件的灵活运用功能上,扮演着轴承.转换器的角色,将一种容器或迭代器装换或封装成另一种容器或迭代器.adaptor这个概念,实际上是一种设计模式,其定义如下: 将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作. 配接器按功能可以分为如下3类: 可以改变函数或仿函数接口的适配器,称为仿函数适配器: 针对容器的适配器,称为容器适配器: 针对迭代器的适配器,称为迭代器适配器. 本博客只介绍仿函数适配器

函数配接器

bind1st(op,value) ----> op(value,param)     //绑定op的第一个参数 bind2st(op,value) ----> op(param,value) not1(op) ---->!op(param) not2(op) ---->!op(param1,param2) 注:其中的bind相关参考boost库中bind内容 int func1(int p1,int p2 ){ cout<<"p1 = "<&

成员函数的函数配接器

在STL标准库中除了提供常规的函数配接器外,还提供了两个针对成员函数的函数配接器,其主要功能是通过这些配接器,你可以针对每一个元素直接去调用其成员函数. 这样的成员函数配接器有两个,分别是: mem_fun_ref(op) 调用对象的成员函数op mem_fun(op) 调用对象指针的成员函数op 这两个函数配接器都是去调用对象中的成员函数op,对于这两个成员函数,以前是只能调用对象的const成员函数,但现在的情况好像有所改变,对所有的成员函数都可以调用了. 具体的示例如下: #include

仿函数(函数对象)

本文乃作者学习<C++标准程序库>的学习笔记,首先介绍了仿函数(函数对象)和函数适配器(配接器)的概念,然后列出STL中所有的仿函数,以及函数适配器,并摘录了几个例子演示仿函数和函数适配器的用法,最后讨论了仿函数的组合,以及实现方法. 1.仿函数是什么东西? <C++标准程序库>里对仿函数的解释是:仿函数是泛型编程强大威力和纯粹抽象概念的又一例证.你可以说,任何东西,只要其行为像函数,它就是一个函数.因此如果你定义了一个对象,行为像函数,它就可以被当做函数来用. 那么,什么才算具备

STL源码分析--仿函数 &amp; 配接器

STL源码分析-仿函数 & 配接器 仿函数就是函数对象.就实现观点而言,仿函数其实就是一个"行为类似函数"的对象.为了能够"行为类似函数",其类别定义中必须自定义(或说改写.重载)function call 运算子(operator()),拥有这样的运算子后,我们就可以在仿函数的对象后面加上一对小括号,以此调用仿函数所定义的operator().仿函数作为可配接的关键因素. 配接器在STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色,adapter的定

《STL源码剖析》学习笔记系列之七、八——仿函数和配接器

1. 仿函数 仿函数又名函数对象,具有函数性质的对象,就是传入一些参数,然后对参数进行某些运算,然后返回一个值.为了能够使行为类似函数,需要在类别定义中必须自定义function call 运算子operator(). 仿函数有如下几类:算术类仿函数(plus<T>.minus<T>)关系运算类仿函数(equal_to<T>.less<T>)逻辑运算类仿函数(logical_and<T>.logical_or<T>.logical_n

STL学习_配接器篇

STL学习_配接器篇 定义 配接器(Adapter)在STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色.它事实上是一种设计模式.即将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作. 分类 STL所提供的各种适配器中,改变仿函数(functors)接口者,称为function adapter:改变容器(containers)接口者,称为container adapter:改变迭代器(iterators)接口者,称为iterato

STL标准程序库第一部分总结(Auto_ptr&amp;&amp;numeric_limits,标准模板库,迭代器的配接器)

一 Auto_ptr的使用 1 auto_ptr 拥有权的转移(auto_ptr要求一个只能有一个对象只能有一个拥有者,严谨一无二主) Std::auto_ptr<ClassA>ptr1(new ClassA) Ptr1拥有new出来的对象 Std::auto_ptr<ClassA>ptr2(ptr1) 把控制权交给ptr2此后ptr2就拥有了new出来的对象而ptr1不在拥有它了 2通过赋值实现 Std::auto_ptr<ClassA>ptr1(new ClassA

STL学习笔记(迭代器配接器)

Reverse(逆向)迭代器 Reverse迭代器是一种配接器. 重新定义递增运算和递减运算.使其行为正好倒置. 如果你使用这类迭代器,算法将以逆向次序处理元素.所有标准容器都允许使用Reverse迭代器来遍历元素.下面是个例子: 1 #include <iostream> 2 #include <list> 3 #include <algorithm> 4 using namespace std; 5 6 void print(int elem) 7 { 8 cout