标准模板库为我们提供了很多方便,使这些常用的东西不用自己去写。我们今天来看一下all_of和any_of的用法。这两个函数是C++11新增加 的,我用的是g++4,.8.1 别忘了编译的时候加上参数-std=c++11。
我们先来看一下两个两个函数的原型
template<class InputIterator, class Predicate>
bool all_of ( InputIterator _First, InputIterator _Last, Predicate _Pred );
template<class InputIterator, class Predicate>
bool any_of ( InputIterator _First, InputIterator _Last, Predicate _Pred );
参考资料:VS2012帮助文档
两个函数是做什么用的呢?
很简单,第一个函数检查是否所有的元素都满足给定的条件,第二个函数检查是否存在元素满足给定条件,第三个参数为一个接受一个参数的函数,因为只能接受一个参数,所以我们需要通过其他途径来完成我们的任务。
cout << any_of(i_num, i_num + 6, bind2nd(greater<int>(),7)) << endl;//可以这么写,查找给定范围是否存在大于7的数据,其中i_num是有六个元素的int数组
如果你还没有了解bind2nd(greater<int>(),7)是个什么东西,你也可以自己定义一个函数。
比如我定义这么一个函数模板
template<typename type, int n>
bool tiaojian(const type& num)
{
return num > n;
}
cout << any_of(i_num, i_num + 6, tiaojian<int,7>) << endl;//等同于上面的语句
当然,如果你连函数模板也没有用过,那么就吧type改成int 也是可以的。
那么说来说去这两个到底是个什么东西呢,我们来看一下它们的实现方法。
下面是all_of的定义
template class InputIterator,class UnaryPredicate;
bool all_of (InputIterator first, InputIterator last, UnaryPredicate pred)
{
while (first!=last) {
if (!pred(*first)) return false ; //如果找到了一个不符合条件的元素,那么返回false
++first;
}
return true ;
}下面是any_of的定义template class InputIterator, class UnaryPredicate ;
bool any_of (InputIterator first, InputIterator last, UnaryPredicate pred)
{
while (first!=last) {
if (pred(*first)) return true ;//如果找到了符合条件的元素那么返回真
++first;
}
return false ;//如果没有找到,那么返回假
}参考资料:cplusplus.com
以上均为个人观点,如果有错误,请大家指正,如果有什么地方没有说明白也可以在下面留言。
评论(0)