// <algorithm> 
template <class InputIterator, class Predicate>
    typename iterator_traits<InputIterator>::difference_type
        count_if (InputIterator first,
​                  InputIterator last, UnaryPredicate pred);

返回值满足给定条件的元素的个数。

该函数等价于:

template<class _InIt,
class _Pr> inline
    typename iterator_traits<_InIt>::difference_type
    _Count_if(_InIt _First, _InIt _Last, _Pr _Pred)
{	// count elements satisfying _Pred
    typename iterator_traits<_InIt>::difference_type _Count = 0;

    for (; _First != _Last; ++_First)
        if (_Pred(*_First))
            ++_Count;
    return (_Count);
}
  • firstlast

    分别指向一个序列中初始及末尾位置的输入迭代器。这个范围即 [first,last) ,包括 first 到 last 间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。

    pred

    一元谓词(Unary)函数,以范围中的一个元素为参数,然后返回一个可转换成 bool 类型的值。

    其返回值表明指定元素是否满足当前函数所检测的条件。

    该函数不能修改其参数。

    可以是函数指针(Function pointer)类型或函数对象(Function object)类型。

  • 返回范围中使谓词函数返回 true 的元素的个数。

    返回值类型 iterator_traits<InputIterator>::difference_type 为有符号整数(Signed integral type)

  • 参照 std::sort 以获得与自定义函数谓词、函数对象谓词、对象数组、lambda 表达式 C++11、初始化列表 std::initializer_list C++11 等相关的例子。

    例 1

    #include <iostream>
    #include <algorithm>
    #include <functional>
    #include <vector>
    
    namespace ClassFoo{
        bool BigThan5(int & n) { return n > 5; }
        void CountIf() {
            int iarray[] = { 0, 6, 2, 3, 4, 5, 6, 4, 6, 7, 8 };
            std::vector<int> foo1(iarray, iarray + sizeof(iarray) / sizeof(int));
            // 返回值为大于 5 的元素的个数
            std::cout << std::count_if(foo1.begin(), foo1.end(), BigThan5) << std::endl;
        }
    }
    int main()
    {
        ClassFoo::CountIf();
        return 0;
    }

    5

    例 2

    C++11

    #include <iostream>
    #include <algorithm>
    #include <functional>
    #include <vector>
    
    namespace ClassFoo{
        void CountIf() {
            std::vector<int> foo = { 0, 6, 2, 3, 4, 5, 6, 4, 6, 7, 8 };
            // 返回值为大于 5 的元素的个数
            std::cout << std::count_if(foo.begin(), foo.end(),
                [](int &n) { return n > 5; }) << std::endl;
        }
    }
    int main()
    {
        ClassFoo::CountIf();
        return 0;
    }

    5

  • 复杂度

    O(N)N 等值于 std::distance(first,last)

    数据争用相关

    访问在范围 [first,last) 中的所有元素,且每个元素确定只被访问一次。

    异常安全性相关

    如果 pred 或操作某个迭代器抛异常,该函数才会抛异常。

    注意 无效参数将导致未定义行为(Undefined behavior)