C++函数对象count,第1张

C++函数对象count,第2张

Count_if在标准库中可以统计容器中满足一定条件的元素个数。例如,要计算整数向量——ivec中正数的个数,可以先编写一个条件函数,返回类型为bool,参数为int:boolpred(intval)...{
return val > 0;
}
那么count _ if (ivec.begin()、ivec.end()、pred)可以用来计算正整数的个数。但是这种方法有一个明显的缺陷:如果要统计大于10的数和大于100的数...你要写很多类似的函数。能不能进一步抽象一下?如果可以调用count _ if: count _ if (ivec。begin(),ivec。end,pred (n))像这样,可以数出大于n的容器数,该多好啊!函数对象提供了这样一种机制。

简单来说,函数对象就是用()运算符重载的对象,可以像函数一样使用。例如,这个添加类:

类别添加...{
public:
int operator()(int v1,int v2)...{
return v1+v2;
}
};它可以执行加法运算。例子:int a1=3,a2 = 1;
Add Add;
cout <结果将是4。那么这个机制如何应用到刚才的问题上呢?因为count_if的第三个参数是接受参数的函数,所以可以通过构造函数传入对象,count_if可以自动调用函数对象:

Pred级...{
private:
int _ val;
公共:
Pred(int val):_val(val)...{}
布尔运算符()(int val)...{
return val > _ val;
}
};
所以,要统计大于100的数,可以写:count _ if (ivec.begin()、ivec.end()、pred (100))。Pred(100)构造了一个函数对象,count_if将这个对象依次应用于容器中的每个元素。只要它返回真值,计数器就加1。

如果模板技术被重用,它可以应用于各种类型的容器:

模板
类别Pred...{
private:
T _ val;
公共:
Pred(T val):_val(val)...{}
布尔运算符()(T val)...{
return val > _ val;
}
};这样,刚才的统计语句应该写成:count _ if (ivec.begin()、ivec.end()、pred (100))。如果容器是double类型,只需用double替换尖括号中的int。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++函数对象count

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情