【STL】函数 for_each; remove_if ;bind1st和bind2nd

bind1st和bind2nd函数把一个二元函数对象转换成为一个一元函数对象。 

由于二元函数对象接受两个参数,在绑定成为一元函数对象时需要将原来两个参数中的一个绑定下来。

将二元函数的一个参数绑定为定值,这样二元函数就转换为了一元函数,传进来的参数都相当于是另外一个参数了。//bind1st是绑定第一个参数,bind2nd则是绑定第二个参数。 

#include 
#include 
#include 

//示例一:remove_if 的普通用法
void removeAll(wstring &str, WCHAR c)
{
	wstring::iterator new_end = remove_if(str.begin(), str.end(), bind2nd(equal_to(),c));
	str.erase(new_end, str.end());
}


//示例二:定义自己的二元函数
template  
struct findchar:binary_function  
{	
	/*
	调用:findchar, 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 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, 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。

你可能感兴趣的:(C++语言)