zoukankan      html  css  js  c++  java
  • 【STL源码剖析读书笔记】【第7章】仿函数

    1、 仿函数也叫作函数对象,是一种具有函数特质的对象,调用者可以像函数一样地调用这些对象。仿函数必须重载operator()

    2、  STL中仿函数代替函数指针的原因在于函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求,函数指针无法与STL其他组件搭配。

    3、  STL仿函数与STL算法之间的关系:


    4、  为了拥有配接能力,每一个仿函数必须定义自己的相应型别,仿函数的相应型别主要来表现函数参数型别和传回值型别。

    5、  unary_function用来呈现一元函数的参数型别和返回值型别。

    //STL规定,每一个Adaptable Unary Function都应继承此类别
    template <class Arg, class Result>
    struct unary_function {
    	typedef Arg argument_type;
    	typedef Result result_type;
    };

    6、binary_function用来呈现二元函数的第一参数型别、第二参数型别及返回值型别。

    //STL规定,每一个Adaptable Binary Function都应继承此类别
    template <class Arg1, class Arg2, class Result>
    struct binary_function {
    	typedef Arg1 first_argument_type;
    	typedef Arg2 second_argument_type;
    	typedef Result result_type;
    };
    

    7、  STL内建算术类仿函数:加法:plus<T>,减法:minus<T>,乘法:multiplies<T>,除法:divides<T>,取模:modulus<T>,取反:negate<T>。

    8、  STL内建关系类仿函数:等于:equal_to<T>,不等于:not_equal_to<T>,大于:greater<T>,大于等于:greater_equal<T>,小于:less<T>,小于等于:less_equal<T>。

    9、  STL内建逻辑类仿函数:逻辑运算And:logical_and<T>,逻辑运算Or:logical_or<T>,逻辑运算Not:logical_not<T>。

    10、  证同元素:运算op的证同元素是指数值A与该元素做op运算,会得到A自己。

    11、  具体例子:

    #include<functional>
    #include<iostream>
    using namespace std;
    
    int main(){
    	//算术类仿函数
    	plus<int> plusobj;
    	minus<int> minusobj;
    	multiplies<int> mulobj;
    	divides<int> divobj;
    	modulus<int> modobj;
    	negate<int> negobj;
    
    	cout << plusobj(3, 5) << endl; //8
    	cout << minusobj(3, 5) << endl; //-2
    	cout << mulobj(3, 5) << endl; //15
    	cout << divobj(3, 5) << endl; //0
    	cout << modobj(3, 5) << endl; //3
    	cout << negobj(3) << endl; //-3
    	//用临时对象调用
    	cout << plus<int>()(3, 5) << endl; //8
    	cout << minus<int>()(3, 5) << endl;//-2
    	cout << multiplies<int>()(3, 5) << endl;//15
    	cout << divides<int>()(3, 5) << endl;//0
    	cout << modulus<int>()(3, 5) << endl;//3
    	cout << negate<int>()(3) << endl;//-3
    	//关系类仿函数
    	equal_to<int> equal_to_obj; //,不等于:,大于:greater<T>,大于等于:greater_equal<T>,小于:less<T>,小于等于:less_equal<T>。
    	not_equal_to<int> not_equal_to_obj;
    	greater<int> greater_obj;
    	greater_equal<int> greater_equal_obj;
    	less<int> less_obj;
    	less_equal<int> less_equal_obj;
    
    	cout << boolalpha << equal_to_obj(3, 5) << endl; //false
    	cout << not_equal_to_obj(3, 5) << endl;//true
    	cout << greater_obj(3, 5) << endl;//false
    	cout << greater_equal_obj(3, 5) << endl;//false
    	cout << less_obj(3, 5) << endl;//true
    	cout << less_equal_obj(3, 5) << endl;//true
    	//用临时对象调用
    	cout << boolalpha << equal_to<int>()(3, 5) << endl; //false
    	cout << not_equal_to<int>()(3, 5) << endl;//true
    	cout << greater<int>()(3, 5) << endl;//false
    	cout << greater_equal<int>()(3, 5) << endl;//false
    	cout << less<int>()(3, 5) << endl;//true
    	cout << less_equal<int>()(3, 5) << endl;//true
    	//逻辑类仿函数
    	logical_and<int> logical_and_obj;
    	logical_or<int> logical_or_obj;
    	logical_not<int> logical_not_obj;
    
    	cout << logical_and_obj(1, 0) << endl; //false
    	cout << logical_or_obj(1, 0) << endl;//true
    	cout << logical_not_obj(1) << endl;//false
    	//用临时对象调用
    	cout << logical_and<int>()(1, 0) << endl; //false
    	cout << logical_or<int>()(1, 0) << endl;//true
    	cout << logical_not<int>()(1) << endl;//false
    
    	system("pause");
    	return 0;
    }


  • 相关阅读:
    扫雷游戏
    打地鼠Demo
    Game2048
    蛇形矩阵
    约瑟夫环
    二分法查找
    动态规划之防卫导弹
    动态规划之0-1背包问题
    回溯算法之火力网
    回溯算法之8皇后问题
  • 原文地址:https://www.cnblogs.com/ruan875417/p/4558295.html
Copyright © 2011-2022 走看看