让自定仿函数也可以使用函数配接器:
对于自定仿函数,如果希望和函数配接器搭配使用,就必须满足某些条件:必须提供一些型别成员来反映其参数和返回值类型。为方便程序员,标准库提供以下结构:
一元:
template<class _Arg,class _Result>
struct unary_function
{ // base class for unary functions
typedef _Arg argument_type;
typedef _Result result_type;
};
二元: template<class _Arg1,class _Arg2,class _Result>
struct binary_function
{ // base class for binary functions
typedef _Arg1 first_argument_type;
typedef _Arg2 second_argument_type;
typedef _Result result_type;
};
如此一来,自定仿函数只要继承两种形式之一,就能轻松满足可配接的条件。*和使用ptr_fun效果一样,http://blog.csdn.net/ggz631047367/article/details/38058245
例:
template<class T1,class T2>
struct fopow:public binary_function<T1,T2,T1>
{
T1 operator()(T1 base, T2 exp)const
{
return pow(base, exp);
}
};
int main()
{
vector<int> coll;
for (int i = 1; i <= 9; ++i)
{
coll.push_back(i);
}
transform(coll.begin(), coll.end(), ostream_iterator<int>(cout, " "), bind1st(fopow<float, int>(), 3));
cout << endl;
transform(coll.begin(), coll.end(), ostream_iterator<int>(cout, " "), bind2nd(fopow<float, int>(), 3));
cout << endl;
system("pause");
return 0;
}
输出:
3 9 27 81 243 729 2187 6561 19683
1 8 27 64 125 216 343 512 729
组合型仿函数:
功能
自定义名称
SGI STL采用名称
f(g(elem))
compose_f_gx
compose1
f(g(elem1,elem2))
compose_f_gxy
f(g(elem),h(elem))
compose_f_gx_hx
compose2
f(g(elem1),h(elem2))
compose_f_gx_hy
一元组合函数配接器:
compose_f_gx的实作:先加10再乘4
template<class OP1, class OP2>
class compose_f_gx_t :public std::unary_function < typename OP2::argument_type, typename OP1::result_type > {
private:
OP1 op1;//op1(op2(x))
OP2 op2;
public:
compose_f_gx_t(const OP1&o1, const OP2&o2) :op1(o1), op2(o2){}
typename OP1::result_type operator()(const typename OP2::argument_type&x)const{
return op1(op2(x));
}
};
template<class OP1, class OP2>
inline compose_f_gx_t<OP1, OP2> compose_f_gx(const OP1&o1, const OP2&o2)
{
return compose_f_gx_t<OP1, OP2>(o1, o2);
}
int main()
{
vector<int> coll;
for (int i = 1; i <= 9; ++i)
{
coll.push_back(i);
}
transform(coll.begin(), coll.end(), ostream_iterator<int>(cout, " "),
compose_f_gx(bind2nd(multiplies<int>(),4),bind2nd(plus<int>(),10)));
cout << endl;
system("pause");
return 0;
}
compose_f_gx_hx的实作:大于4小于7
template<class OP1, class OP2, class OP3>
class compose_f_gx_hx_t :public std::unary_function<typename OP2::argument_type, typename OP1::result_type> {
private:
OP1 op1;//op1(op2(x),op3(x))
OP2 op2;
OP3 op3;
public:
compose_f_gx_hx_t(const OP1&o1, const OP2&o2, const OP3&o3) :op1(o1), op2(o2), op3(o3){}
typename OP1::result_type operator()(const typename OP2::argument_type& x)const{
return op1(op2(x), op3(x));
}
};
template<class OP1, class OP2, class OP3>
inline compose_f_gx_hx_t<OP1, OP2, OP3> compose_f_gx_hx(const OP1&o1, const OP2&o2, const OP3&o3)
{
return compose_f_gx_hx_t<OP1, OP2, OP3>(o1, o2, o3);
}
int main()
{
vector<int> coll;
for (int i = 1; i <= 9; ++i)
{
coll.push_back(i);
}
vector<int>::iterator pos;
pos=remove_if(coll.begin(), coll.end(),
compose_f_gx_hx(logical_and<bool>(),bind2nd(greater<int>(),4),bind2nd(less<int>(),7)));
coll.erase(pos, coll.end());
copy(coll.begin(), coll.end(), ostream_iterator<int>(cout, " "));
cout << endl;
system("pause");
return 0;
}
输出:
1 2 3 4 7 8 9
二元组合函数配接器:
compose_f_gx_hy的实:在一个字符串中以“区分大小写”的方式搜寻一个字符串
template<class OP1, class OP2, class OP3>
class compose_f_gx_hy_t :public std::binary_function<typename OP2::argument_type,
typename OP3::argument_type, typename OP1::result_type> {
private:
OP1 op1;//op1(op2(x),op3(y))
OP2 op2;
OP3 op3;
public:
compose_f_gx_hy_t(const OP1&o1, const OP2&o2, const OP3&o3) :op1(o1), op2(o2), op3(o3){}
typename OP1::result_type operator()(const typename OP2::argument_type& x,
const typename OP3::argument_type&y)const{
return op1(op2(x), op3(y));
}
};
template<class OP1, class OP2, class OP3>
inline compose_f_gx_hy_t<OP1, OP2, OP3> compose_f_gx_hy(const OP1&o1, const OP2&o2, const OP3&o3)
{
return compose_f_gx_hy_t<OP1, OP2, OP3>(o1, o2, o3);
}
int main()
{
string s("Internationalization");
string sub("Nation");
string::iterator pos;
pos = search(s.begin(), s.end(), sub.end(), sub.end(),
compose_f_gx_hy(equal_to<int>(), ptr_fun(toupper), ptr_fun(toupper)));
if (pos != s.end())
{
cout << """ << sub << "" is part of "" << s << """ << endl;
}
system("pause");
return 0;
}
输出:
"Nation" is part of "Internationalization"