STL中bind1st和bind2nd之解析

今天看到<>一书课后习题14.42,问题如下:

使用标准库函数对象及适配器定义一条表达式,令其:统计大于1024的值有多少个。

解题利用标准库函数对象类greater 答案为:

count_if(vec.begin(),vec.end(),bind2nd(greater(),1024));
这样就牵扯出了bind1st 和 bind2nd 这两个捆绑函数。

这两个适配器函数和标准库函数对象类都是定义在functional头文件中的,其中,bind是捆绑的意思,1st和2nd分别是first和second的意思。

两者函数声明如下:

bind1st(const Operation& op, const T& x)
bind2nd(const Operation& op, const T& x)
bind1st函数代表这么一个操作:  x op value;      bind2nd函数代表:value op x

其中,value 是被应用bind函数的对象。这两个适配器函数都用于将一个二元算子转换成一个一元算子。


例子1:我们想知道一个vector中元素值大于100的元素个数,利用bind1st函数和less标准库对象类,就是使得

100

#include "stdafx.h"
#include 
#include 
#include 
#include 
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	vector vec;
	int a;
	while (cin >> a)
		vec.push_back(a);
	cout << count_if(vec.begin(), vec.end(), bind1st(less(), 100));//100 < element?
	cout << endl;
	return 0;
}
结果:

输入:1000 243 2 4 6

输出:2(大于100的元素个数为2)

如果我们要知道容器中小于100的元素的个数,我们可以改为:

bind2nd(less(),100)     //element<100?
当然,这个也等价于:

bind1st(greater(),100)  //100>element?


例子2:删除一个vector中值大于100的元素

用bind1st函数:

//100(),100)),vec.end());
用bind2nd函数:

//element>100
vec.erase(remove_if(vec.begin(),vec.end(),bind2nd(greater(),100)),vec.end());


#include "stdafx.h"
#include 
#include 
#include 
#include 
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	vector vec;
	int a;
	while (cin >> a)
		vec.push_back(a);
	//remove_if()并不会改变容器中的元素的个数,而是将所有应该删除的元素移到容器的尾部,返回一个分界的迭代器
	//然后调用erase将从分界的迭代器到尾后迭代器的所有元素删除
	vec.erase(remove_if(vec.begin(),vec.end(),bind1st(less(),100)),vec.end());
	for (auto c : vec)
		cout << c << endl;
	return 0;
}

STL中bind1st和bind2nd之解析_第1张图片
说了这么多, bind1st和bind2nd 的最重要区别就是 操作对象的顺序相反!






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