C++中的谓词函数

标准库容器定义的操作非常少,标准库没有给容器添加大量的功能函数,而是选择提供一组算法,这些算法大都不依赖容器类型,对不同类型的容器都适用。泛型算法有一组定义在头文件<algorithm>,有一组定义在头文件<numeric>中。

在泛型算法中,有些算法需要判断容器元素是否满足某个条件,比如判断vector<int> 中的元素能否被2整出,如果用迭代器这个遍历将会比较麻烦,更好的办法是利用谓词函数,谓词函数用于泛型算法中,用于做某些检测。

下面是实现谓词函数的代码:

# include <iostream>
using namespace std;
# include <string>
# include <algorithm>
# include <vector>
int main()
{
	string s1[3]={"hello","world","hi"};
	bool GT(string &s);
	vector <string> a(s1,s1+3);
	int i=count_if(a.begin(),a.end(),GT); //谓词函数作算法的实参
	cout<<i<<endl;
	cin.get();
    return 0;
}

bool GT(string &s)     //定义谓词函数
{
return s.size()>=5;   //判断字符串的长度是否大于等于5
}

上面的例子中,谓词函数GT用于判断容器内元素长度是否大于6,返回布尔类型的值1或者0,然后count_if函数统计满足条件的元素个数。GT用作count_if算法的实参。

上面的办法显然不够灵活,如果想要灵活改变字符串的长度边界,比如改为判断长度大于3的字符串,则需要改写函数,但更好的办法是将函数对象应用于算法。代码如下:

# include <iostream>
using namespace std;
# include <string>
# include <vector>
# include <algorithm>
class GT{                     //定义谓词函数对象
public:
	GT(int i):len(i){}
	bool operator()(string &s);   //重载()运算符
private:
	int len;             //len 为字符串长度边界 
};
bool GT::operator()(string &s1)
{
return s1.size()>=len;
}
int main()
{   string t[3]={"hello","world","hi"};
    vector <string> a(t,t+3);
    cout<<count_if(a.begin(),a.end(),GT(5))<<endl;
    cin.get();
    return 0;
}