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