C++ STL源码学习(仿函数篇)
来源:互联网 发布:印度直播软件 编辑:程序博客网 时间:2024/05/16 17:25
stl_function.h
///仿函数的实现并不复杂template <class _Arg, class _Result>struct unary_function{ typedef _Arg argument_type; typedef _Result result_type;};template <class _Arg1, class _Arg2, class _Result>struct binary_function{ typedef _Arg1 first_argument_type; typedef _Arg2 second_argument_type; typedef _Result result_type;};template <class _Tp>struct plus : public binary_function<_Tp,_Tp,_Tp>{ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; }};template <class _Tp>struct minus : public binary_function<_Tp,_Tp,_Tp>{ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; }};template <class _Tp>struct multiplies : public binary_function<_Tp,_Tp,_Tp>{ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; }};template <class _Tp>struct divides : public binary_function<_Tp,_Tp,_Tp>{ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x / __y; }};/// identity_element (not part of the C++ standard).template <class _Tp> inline _Tp identity_element(plus<_Tp>){ return _Tp(0);}template <class _Tp> inline _Tp identity_element(multiplies<_Tp>){ return _Tp(1);}template <class _Tp>struct modulus : public binary_function<_Tp,_Tp,_Tp>{ _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x % __y; }};template <class _Tp>struct negate : public unary_function<_Tp,_Tp>{ _Tp operator()(const _Tp& __x) const { return -__x; }};template <class _Tp>struct equal_to : public binary_function<_Tp,_Tp,bool>{ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; }};template <class _Tp>struct not_equal_to : public binary_function<_Tp,_Tp,bool>{ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x != __y; }};template <class _Tp>struct greater : public binary_function<_Tp,_Tp,bool>{ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x > __y; }};template <class _Tp>struct less : public binary_function<_Tp,_Tp,bool>{ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }};template <class _Tp>struct greater_equal : public binary_function<_Tp,_Tp,bool>{ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x >= __y; }};template <class _Tp>struct less_equal : public binary_function<_Tp,_Tp,bool>{ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x <= __y; }};template <class _Tp>struct logical_and : public binary_function<_Tp,_Tp,bool>{ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x && __y; }};template <class _Tp>struct logical_or : public binary_function<_Tp,_Tp,bool>{ bool operator()(const _Tp& __x, const _Tp& __y) const { return __x || __y; }};template <class _Tp>struct logical_not : public unary_function<_Tp,bool>{ bool operator()(const _Tp& __x) const { return !__x; }};///将传入的函数对象存储,调用该对象的函数调用操作符时,调用///保存对象的函数调用操作符,并对其返回值求反,再作为该对象///函数调用操作符的返回值template <class _Predicate>class unary_negate : public unary_function<typename _Predicate::argument_type, bool>{protected: _Predicate _M_pred;public: explicit unary_negate(const _Predicate& __x) : _M_pred(__x) {} bool operator()(const typename _Predicate::argument_type& __x) const { return !_M_pred(__x); }};template <class _Predicate>inline unary_negate<_Predicate>not1(const _Predicate& __pred){ return unary_negate<_Predicate>(__pred);}template <class _Predicate>class binary_negate : public binary_function<typename _Predicate::first_argument_type, typename _Predicate::second_argument_type, bool>{protected: _Predicate _M_pred;public: explicit binary_negate(const _Predicate& __x) : _M_pred(__x) {} bool operator()(const typename _Predicate::first_argument_type& __x, const typename _Predicate::second_argument_type& __y) const { return !_M_pred(__x, __y); }};template <class _Predicate>inline binary_negate<_Predicate>not2(const _Predicate& __pred){ return binary_negate<_Predicate>(__pred);}///将传入的函数对象和其第一个参数保存,待需要时,再行绑定template <class _Operation>class binder1st : public unary_function<typename _Operation::second_argument_type, typename _Operation::result_type>{protected: _Operation op; typename _Operation::first_argument_type value;public: binder1st(const _Operation& __x, const typename _Operation::first_argument_type& __y) : op(__x), value(__y) {} typename _Operation::result_type operator()(const typename _Operation::second_argument_type& __x) const { return op(value, __x); }};template <class _Operation, class _Tp>inline binder1st<_Operation>bind1st(const _Operation& __fn, const _Tp& __x){ typedef typename _Operation::first_argument_type _Arg1_type; return binder1st<_Operation>(__fn, _Arg1_type(__x));}template <class _Operation>class binder2nd : public unary_function<typename _Operation::first_argument_type, typename _Operation::result_type>{protected: _Operation op; typename _Operation::second_argument_type value;public: binder2nd(const _Operation& __x, const typename _Operation::second_argument_type& __y) : op(__x), value(__y) {} typename _Operation::result_type operator()(const typename _Operation::first_argument_type& __x) const { return op(__x, value); }};template <class _Operation, class _Tp>inline binder2nd<_Operation>bind2nd(const _Operation& __fn, const _Tp& __x){ typedef typename _Operation::second_argument_type _Arg2_type; return binder2nd<_Operation>(__fn, _Arg2_type(__x));}/// unary_compose and binary_compose (extensions, not part of the standard).///将两个医院函数组合为一个一元参数,第二个函数的返回值作为第一个函数的参数template <class _Operation1, class _Operation2>class unary_compose : public unary_function<typename _Operation2::argument_type, typename _Operation1::result_type>{protected: _Operation1 _M_fn1; _Operation2 _M_fn2;public: unary_compose(const _Operation1& __x, const _Operation2& __y) : _M_fn1(__x), _M_fn2(__y) {} typename _Operation1::result_type operator()(const typename _Operation2::argument_type& __x) const { return _M_fn1(_M_fn2(__x)); }};template <class _Operation1, class _Operation2>inline unary_compose<_Operation1,_Operation2>compose1(const _Operation1& __fn1, const _Operation2& __fn2){ return unary_compose<_Operation1,_Operation2>(__fn1, __fn2);}template <class _Operation1, class _Operation2, class _Operation3>class binary_compose : public unary_function<typename _Operation2::argument_type, typename _Operation1::result_type>{protected: _Operation1 _M_fn1; _Operation2 _M_fn2; _Operation3 _M_fn3;public: binary_compose(const _Operation1& __x, const _Operation2& __y, const _Operation3& __z) : _M_fn1(__x), _M_fn2(__y), _M_fn3(__z) { } typename _Operation1::result_type operator()(const typename _Operation2::argument_type& __x) const { return _M_fn1(_M_fn2(__x), _M_fn3(__x)); }};template <class _Operation1, class _Operation2, class _Operation3>inline binary_compose<_Operation1, _Operation2, _Operation3>compose2(const _Operation1& __fn1, const _Operation2& __fn2, const _Operation3& __fn3){ return binary_compose<_Operation1,_Operation2,_Operation3> (__fn1, __fn2, __fn3);}template <class _Arg, class _Result>class pointer_to_unary_function : public unary_function<_Arg, _Result>{protected:///返回值为_Result类型,参数类型为_Arg的函数指针 _Result (*_M_ptr)(_Arg);public: pointer_to_unary_function() {} explicit pointer_to_unary_function(_Result (*__x)(_Arg)) : _M_ptr(__x) {} _Result operator()(_Arg __x) const { return _M_ptr(__x); }};template <class _Arg, class _Result>inline pointer_to_unary_function<_Arg, _Result> ptr_fun(_Result (*__x)(_Arg)){ return pointer_to_unary_function<_Arg, _Result>(__x);}template <class _Arg1, class _Arg2, class _Result>class pointer_to_binary_function : public binary_function<_Arg1,_Arg2,_Result>{protected: _Result (*_M_ptr)(_Arg1, _Arg2);public: pointer_to_binary_function() {} explicit pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2)) : _M_ptr(__x) {} _Result operator()(_Arg1 __x, _Arg2 __y) const { return _M_ptr(__x, __y); }};template <class _Arg1, class _Arg2, class _Result>inline pointer_to_binary_function<_Arg1,_Arg2,_Result>ptr_fun(_Result (*__x)(_Arg1, _Arg2)){ return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__x);}/// identity is an extensions: it is not part of the standard.template <class _Tp>struct _Identity : public unary_function<_Tp,_Tp>{ const _Tp& operator()(const _Tp& __x) const { return __x; }};template <class _Tp> struct identity : public _Identity<_Tp> {};/// select1st and select2nd are extensions: they are not part of the standard.///_Select1st和_Select2nd为了在map和multimap中作为根据值推导键的函数来提供的///除此之外,STL中未用到template <class _Pair>struct _Select1st : public unary_function<_Pair, typename _Pair::first_type>{ const typename _Pair::first_type& operator()(const _Pair& __x) const { return __x.first; }};template <class _Pair>struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type>{ const typename _Pair::second_type& operator()(const _Pair& __x) const { return __x.second; }};template <class _Pair> struct select1st : public _Select1st<_Pair> {};template <class _Pair> struct select2nd : public _Select2nd<_Pair> {};///由于成员函数的调用,隐式传递了一个this指针,因此只需要将这个this指针///变成显式传递,即可当做普通函数使用,STL成员函数适配器即采用这种方法///将_Tp类的对象指针和其返回值为_Ret,参数为空的成员函数绑定,生成///一个一元函数,该一元函数的参数为_Tp类指针template <class _Ret, class _Tp>class mem_fun_t : public unary_function<_Tp*,_Ret>{public: explicit mem_fun_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {} _Ret operator()(_Tp* __p) const { return (__p->*_M_f)(); }private: _Ret (_Tp::*_M_f)();};///将_Tp类的对象指针和其返回值为_Ret,参数为空的常成员函数绑定,生成///一个一元函数,该一元函数的参数为指向const Tp 类的指针template <class _Ret, class _Tp>class const_mem_fun_t : public unary_function<const _Tp*,_Ret>{public: explicit const_mem_fun_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {} _Ret operator()(const _Tp* __p) const { return (__p->*_M_f)(); }private: _Ret (_Tp::*_M_f)() const;};///将_Tp类的对象和其返回值为_Ret,参数为空的成员函数绑定,生成///一个一元函数template <class _Ret, class _Tp>class mem_fun_ref_t : public unary_function<_Tp,_Ret>{public: explicit mem_fun_ref_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {} _Ret operator()(_Tp& __r) const { return (__r.*_M_f)(); }private: _Ret (_Tp::*_M_f)();};///将_Tp类的对象和其返回值为_Ret,参数为空的常成员函数绑定,生成///一个一元函数template <class _Ret, class _Tp>class const_mem_fun_ref_t : public unary_function<_Tp,_Ret>{public: explicit const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {} _Ret operator()(const _Tp& __r) const { return (__r.*_M_f)(); }private: _Ret (_Tp::*_M_f)() const;};///将_Tp类的对象和其返回值为_Ret,参数为_Arg类型的常成员函数绑定,生成///一个二元函数template <class _Ret, class _Tp, class _Arg>class mem_fun1_t : public binary_function<_Tp*,_Arg,_Ret>{public: explicit mem_fun1_t(_Ret (_Tp::*__pf)(_Arg)) : _M_f(__pf) {} _Ret operator()(_Tp* __p, _Arg __x) const { return (__p->*_M_f)(__x); }private: _Ret (_Tp::*_M_f)(_Arg);};template <class _Ret, class _Tp, class _Arg>class const_mem_fun1_t : public binary_function<const _Tp*,_Arg,_Ret>{public: explicit const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {} _Ret operator()(const _Tp* __p, _Arg __x) const { return (__p->*_M_f)(__x); }private: _Ret (_Tp::*_M_f)(_Arg) const;};template <class _Ret, class _Tp, class _Arg>class mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret>{public: explicit mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg)) : _M_f(__pf) {} _Ret operator()(_Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); }private: _Ret (_Tp::*_M_f)(_Arg);};template <class _Ret, class _Tp, class _Arg>class const_mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret>{public: explicit const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const) : _M_f(__pf) {} _Ret operator()(const _Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); }private: _Ret (_Tp::*_M_f)(_Arg) const;};template <class _Ret, class _Tp>inline mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)()){ return mem_fun_t<_Ret,_Tp>(__f);}template <class _Ret, class _Tp>inline const_mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)() const){ return const_mem_fun_t<_Ret,_Tp>(__f);}template <class _Ret, class _Tp>inline mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)()){ return mem_fun_ref_t<_Ret,_Tp>(__f);}template <class _Ret, class _Tp>inline const_mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)() const){ return const_mem_fun_ref_t<_Ret,_Tp>(__f);}template <class _Ret, class _Tp, class _Arg>inline mem_fun1_t<_Ret,_Tp,_Arg> mem_fun(_Ret (_Tp::*__f)(_Arg)){ return mem_fun1_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline const_mem_fun1_t<_Ret,_Tp,_Arg> mem_fun(_Ret (_Tp::*__f)(_Arg) const){ return const_mem_fun1_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline mem_fun1_ref_t<_Ret,_Tp,_Arg> mem_fun_ref(_Ret (_Tp::*__f)(_Arg)){ return mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline const_mem_fun1_ref_t<_Ret,_Tp,_Arg>mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const){ return const_mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline mem_fun1_t<_Ret,_Tp,_Arg> mem_fun1(_Ret (_Tp::*__f)(_Arg)){ return mem_fun1_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline const_mem_fun1_t<_Ret,_Tp,_Arg> mem_fun1(_Ret (_Tp::*__f)(_Arg) const){ return const_mem_fun1_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline mem_fun1_ref_t<_Ret,_Tp,_Arg> mem_fun1_ref(_Ret (_Tp::*__f)(_Arg)){ return mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f);}template <class _Ret, class _Tp, class _Arg>inline const_mem_fun1_ref_t<_Ret,_Tp,_Arg>mem_fun1_ref(_Ret (_Tp::*__f)(_Arg) const){ return const_mem_fun1_ref_t<_Ret,_Tp,_Arg>(__f);}
0 0
- C++ STL源码学习(仿函数篇)
- C++STL:仿函数
- C++STL 仿函数
- stl源码剖析 详细学习笔记 仿函数
- STL源码学习——仿函数和配接器
- STL源码学习_1 简介概述,仿函数
- STL学习_仿函数篇
- STL学习笔记----8.STL仿函数
- STL学习笔记----8.STL仿函数
- STL源码剖析笔记五--仿函数
- 《STL源码剖析》仿函数和配接器
- STL源码分析--仿函数 & 配接器
- STL源码剖析----算法、仿函数、配接器
- STL源码剖析之仿函数
- STL 源码剖析笔记之仿函数
- 数据结构与C++stl(2) 仿函数
- C++ STL之仿函数
- 《STL源码剖析》学习笔记系列之七、八——仿函数和配接器
- 黑马程序员—java中的hashCode与equals
- 赞美奋进的debian和为美剧到来欢呼一下lol
- nhibernate profiler使用
- C++中一个高效的内存池实现
- Golang适合高并发场景的原因分析
- C++ STL源码学习(仿函数篇)
- Scheme 语言概要上
- 源码安装postgresql934
- hdu 5037 Frog(北京网络赛)
- 超几何函数 C++
- 1001. A+B Format (20) ——PAT (Advanced Level) Practise
- spring与hibernate整合-使用properties文件分离数据库连接设置
- iostat来对linux硬盘IO性能进行了解
- NodeBB,一个基于nodejs的响应式论坛