标准模板库为我们提供了很多方便,使这些常用的东西不用自己去写。我们今天来看一下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

以上均为个人观点,如果有错误,请大家指正,如果有什么地方没有说明白也可以在下面留言。