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

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值