今天看到<
使用标准库函数对象及适配器定义一条表达式,令其:统计大于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;
}