bind1st和bind2nd函数把一个二元函数对象转换成为一个一元函数对象。
由于二元函数对象接受两个参数,在绑定成为一元函数对象时需要将原来两个参数中的一个绑定下来。
将二元函数的一个参数绑定为定值,这样二元函数就转换为了一元函数,传进来的参数都相当于是另外一个参数了。//bind1st是绑定第一个参数,bind2nd则是绑定第二个参数。
#include <vector>
#include <algorithm>
#include <functional>
//示例一:remove_if 的普通用法
void removeAll(wstring &str, WCHAR c)
{
wstring::iterator new_end = remove_if(str.begin(), str.end(), bind2nd(equal_to<WCHAR>(),c));
str.erase(new_end, str.end());
}
//示例二:定义自己的二元函数
template <typename T, typename ch>
struct findchar:binary_function <T,ch,bool>
{
/*
调用:findchar<vector<WCHAR>, WCHAR>()
查找容器x中是否存在y字符,有则返回true,没有返回false;
*/
bool operator() (const T& x, const ch& y) const
{
if (::find(x.begin(),x.end(), y) != x.end())
return true;
return false;
}
};
static const WCHAR stChars[] =
{
L'\r', L'\n' //回车符, 换行符
};
wstring RemoveChars(const wstring& wtrBuf)
{
wstring strWSrc = wtrBuf;
vector<WCHAR> vChar;
for ( int i = 0; i < _countof( stChars ); ++i )
{
vChar.push_back(stChars[i]);
}
/*
bind1st: 这里将vChar绑定到findchar函数的第一个参数中。
remove_if(beg, end, op) 移除区间[beg,end)中每一个“令判断式:op(elem)获得true”的元素;
remove_if本身需要的是个一元函数op,但是我们用bind1st将二元函数的一个参数设置为定值,这样二元函数就转换为了一元函数, remove_if传进来的参数都相当于是另外一个参数了。
*/
wstring::iterator itrRemove = remove_if(strWSrc.begin(), strWSrc.end(), bind1st(findchar<vector<WCHAR>, WCHAR>(), vChar));
strWSrc.erase(itrRemove, strWSrc.end());
return strWSrc;
}
其他 : not1; mem_fun和mem_fun_ref;
如果要对容器vECS中的所有对象都进行相同的操作而不自己写循环的话。
for_each(vECS.begin(),vECS.end(), mem_fun(DoSomething));
mem_fun_ref的作用和用法跟mem_fun一样,唯一的不同就是:
当容器中存放的是对象实体的时候用mem_fun_ref,
当容器中存放的是对象指针的时候用mem_fun。