您的位置:首页 > 其它

bind1st bind2snd解析

2015-12-11 14:12 274 查看
头文件:#include <algorithm>

先不要被吓到,其实这两个配接器很简单。

首先,他们都在头文件<functional>中定义。

其次,bind就是绑定的意思,而1st就代表first,2nd就代表second,现在名在可以很快记住了。

再次,他们的申明是一样的,都是(const Operation& op, const T& x)。

简单的说,bind1st(const Operation& op, const T& x)就是这么一个操作:x operation value,而bind2nd(const Operation& op, const T& x)就是这么一个操作:value operation x,其中value是被应用bind的对象。这两个配接器都用于将一个二元算子转换成一个一元算子。下面来看一段代码吧!
//Coded by www.programlife.net
#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
	vector<int> coll;
	for(int i = 1; i <= 10; ++i)
	{
		coll.push_back(i);
	}
	//查找元素值大于10的元素的个数
	//也就是使得10 < elem成立的元素个数 
	int res = count_if(coll.begin(), coll.end(), bind1st(less<int>(), 10));
	cout << res << endl;
	//查找元素值小于10的元素的个数
	//也就是使得elem < 10成立的元素个数 
	res = count_if(coll.begin(), coll.end(), bind2nd(less<int>(), 10));
	cout << res << endl;
	
	return 0;
}


程序的输出结果是0 9
来自:http://www.programlife.net/stl-bind1st-bind2nd-demo.html

如果某个函数或函数对象调用需要两个参数,bind1st会邦定我们在调用bind1st的函数调用表达式中给出的参数为函数对象的第一个参数,而形成一个新的函数对象,也就是将一个二元(两个参数)函数对象的第一个参数固定下来,而形成一个新的只需要一个参数的一元函数对象,而将这个新的函数对象应用到算法时,相当于只有一个参数了(第一个参数已经被绑定),这时候情况就跟上面的例子完全相同了。例如:

void print(int standard,int n) // 创建一个需要两个参数的函数

{

if(n>=standard)

cout<
}
int main()
{
vector v = {63,47,93,75};
// 打印容器中大于60的数据
for_each(v.begin(),v.end(),
bind1st(ptr_fun(print),60)); // 这里,ptr_fun的作用是将一个函数指针构造成一个函数对象(你也可以直接使用函数对象),而bind1st就是帮定这个函数对象的第一个参数为60,也就是standard为60,整个函数变为print(60, int n),只有一个参数了,这是完全跟上面的例子相同了。
return 0;
}

bind2nd的原理是一样的,只不过是为了邦定函数的第二个参数。
而在新标准C++11中,还有bind函数,可以帮定更多参数。这些函数的使用是有点复杂,多加练习,熟悉后就好了。

来自:http://imcc.blogbus.com/logs/162062257.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: