Boost库的bind是对STL的bind1st和bind2nd的进一步泛化,那么我们不免要问,bind相对于bind1st和bind2nd,都有哪些优点呢?下面通过一个具体的例子来说明这个问题。
假如有一个整数的容器vector,现在想找出容器中不大于10的元素的个数,那么我们可以有多种方式来实现:
1. 自由函数方式
BOOL LessEqualToTen(int nTemp)
{
return nTemp <= 10;
}
int nCount = count_if(vctTemp.begin(), vctTemp.end(), LessEqualToTen);
2. 函数对象方式
struct TLessEqualToTen
{
BOOL operator()(int nTemp)
{
return nTemp <= 10;
}
}
int nCount = count_if(vctTemp.begin(), vctTemp.end(), TLessEqualToTen());
3. 以上两种方式都比较麻烦,需要编写单独的函数,而bind1st或bind2nd方式则显得比较简洁
int nCount = count_if(vctTemp.begin(), vctTemp.end(), bind2nd(less_equal<int>(), 10));
或者
int nCount = count_if(vctTemp.begin(), vctTemp.end(), not1(bind2nd(greater<int>(), 10)));
4. bind方式
int nCount = count_if(vctTemp.begin(), vctTemp.end(), bind(less_equal<int>(), _1,10));
通过比较以上4种实现方式我们可以发现,前两种在语法上稍显繁琐,而后两种则显得比较简洁,尤其是最后一种方式,由于使用了占位符,比较符合人的逻辑思维习惯。但单就以上的比较,还不足以看出bind的优势所在。那么,现在让我们找出容器中大于5但小于10的元素的个数,怎么办?采用第3种方式已经无法实现了,前两种方式倒是可以实现,但缺点显而易见,语法太不简练了。让我们试试采用bind如何来实现。
int nCount = count_if(vctTemp.begin(), vctTemp.end(), bind(logical_and<bool>(), bind(greater<int>(), _1, 5), bind(less<int>(), _1, 10));
可以看到,由于bind支持嵌套使用,因此在语法上显得非常的简洁。但bind提供的功能远不止这些,它还提供了对自由函数、函数对象、成员函数、成员变量以及虚函数的调用的支持,并且采用了完全一致的语法。如果没有bind,那么我们对所有这些不同类型函数的调用方式将显得非常不一致甚至是凌乱,总结如下。
1. bind1st和bind2nd不支持对自由函数的直接绑定,如果要绑定自由函数,则需要先使用ptr_fun将自由函数转换为一个函数对象(从binary_function派生)。
2. 转换成员函数为函数对象时,需要考虑传递的是指针还是对象,如果是指针,使用mem_fun,如果是对象,则需要使用mem_fun_ref。另外,mem_fun不支持智能指针。
3. 如果成员函数没有参数,转换为函数对象使用mem_fun或mem_fun_ref;如果成员函数有1个参数,则需要使用mem_fun1或mem_fun1_ref;如果成员函数有2个或2个以上的参数,那么,对不起,mem_fun系列函数将无能为力。
4. mem_fun和mem_fun_ref不支持对成员变量的转换。
转载 http://www.cnblogs.com/hujian/archive/2009/06/13/1502445.html
如有版权问题,请联系QQ: 858668791