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> {};
//验证模板参数是不是一个函数对象类型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> {};
//忽略模板参数为pair类型所包含的相应参数(第一个参数和第二个参数)template <class _Arg1, class _Arg2>struct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> { _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; }};
template <class _Arg1, class _Arg2>struct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> { _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; }};
template <class _Arg1, class _Arg2> struct project1st : public _Project1st<_Arg1, _Arg2> {};
template <class _Arg1, class _Arg2>struct project2nd : public _Project2nd<_Arg1, _Arg2> {};
//忽略调用运算符时相应的参数
template <class _Result>struct _Constant_void_fun { typedef _Result result_type; result_type _M_val;
_Constant_void_fun(const result_type& __v) : _M_val(__v) {} const result_type& operator() const { return _M_val; }};
template <class _Result, class _Argument>struct _Constant_unary_fun { typedef _Argument argument_type; typedef _Result result_type; result_type _M_val;
_Constant_unary_fun(const result_type& __v) : _M_val(__v) {} const result_type& operator()(const _Argument&) const { return _M_val; }};
template <class _Result, class _Arg1, class _Arg2>struct _Constant_binary_fun { typedef _Arg1 first_argument_type; typedef _Arg2 second_argument_type; typedef _Result result_type; _Result _M_val;
_Constant_binary_fun(const _Result& __v) : _M_val(__v) {} const result_type& operator()(const _Arg1&, const _Arg2&) const { return _M_val; }};
//返回一个普通变量的const副本,无论参数为何,只返回同一个值的函数对象template <class _Result>struct constant_void_fun : public _Constant_void_fun<_Result> { constant_void_fun(const _Result& __v) : _Constant_void_fun<_Result>(__v) {}};
template <class _Result, class _Argument __STL_DEPENDENT_DEFAULT_TMPL(_Result)>struct constant_unary_fun : public _Constant_unary_fun<_Result, _Argument>{ constant_unary_fun(const _Result& __v) : _Constant_unary_fun<_Result, _Argument>(__v) {}};
template <class _Result, class _Arg1 __STL_DEPENDENT_DEFAULT_TMPL(_Result), class _Arg2 __STL_DEPENDENT_DEFAULT_TMPL(_Arg1)>struct constant_binary_fun : public _Constant_binary_fun<_Result, _Arg1, _Arg2>{ constant_binary_fun(const _Result& __v) : _Constant_binary_fun<_Result, _Arg1, _Arg2>(__v) {}};
//__STL_DEPENDENT_DEFAULT_TMPL 是一个宏,意思是如果编译器不支持默认模板参数,则使用上一级模板参数template <class _Result>inline constant_void_fun<_Result> constant0(const _Result& __val){ return constant_void_fun<_Result>(__val);}
template <class _Result>inline constant_unary_fun<_Result,_Result> constant1(const _Result& __val){ return constant_unary_fun<_Result,_Result>(__val);}
template <class _Result>inline constant_binary_fun<_Result,_Result,_Result> constant2(const _Result& __val){ return constant_binary_fun<_Result,_Result,_Result>(__val);}//函数返回一个只返回常量和输入参数无关的函数对象
class subtractive_rng : public unary_function<unsigned int, unsigned int> {private: unsigned int _M_table[55]; size_t _M_index1; size_t _M_index2;public: unsigned int operator()(unsigned int __limit) { _M_index1 = (_M_index1 + 1) % 55; _M_index2 = (_M_index2 + 1) % 55; _M_table[_M_index1] = _M_table[_M_index1] - _M_table[_M_index2]; return _M_table[_M_index1] % __limit; } void _M_initialize(unsigned int __seed) { unsigned int __k = 1; _M_table[54] = __seed; size_t __i; for (__i = 0; __i < 54; __i++) { size_t __ii = (21 * (__i + 1) % 55) - 1; _M_table[__ii] = __k; __k = __seed - __k; __seed = _M_table[__ii]; } for (int __loop = 0; __loop < 4; __loop++) { for (__i = 0; __i < 55; __i++) _M_table[__i] = _M_table[__i] - _M_table[(1 + __i + 30) % 55]; } _M_index1 = 0; _M_index2 = 31; } subtractive_rng(unsigned int __seed) { _M_initialize(__seed); } subtractive_rng() { _M_initialize(161803398u); }};
//随机数