// <algorithm> 
template <class InputIterator, class T>
    typename iterator_traits<InputIterator>::difference_type
​        count (InputIterator first, InputIterator last, const T& val);

返回值等价于给定值的元素的个数。

该函数等价于:

template<class _InIt,
    class _Ty> inline
    typename iterator_traits<_InIt>::difference_type
        _Count_np(_InIt _First, _InIt _Last, const _Ty& _Val)
    {    // count elements that match _Val
        typename iterator_traits<_InIt>::difference_type _Count = 0;

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

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

    val

    需要匹配的值。

    返回

    返回范围中与 val 等值的元素的个数。

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

  • 例 1

    #include <iostream>
    #include <algorithm>
    #include <functional>
    #include <vector>
    int main()
    {
        int iarray[] = { 0, 6, 2, 3, 4, 5, 6, 4, 6, 7, 8 };
        // 将 C 型数组转换成 std::vector 对象
        std::vector<int> foo1(iarray, iarray + sizeof(iarray) / sizeof(int));
        // 返回值为 6 的元素的个数
        std::cout << std::count(foo1.begin(), foo1.end(), 6) << std::endl;
        return 0;
    }

    3

    例 2

    C++11

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <iterator>
    
    int main()
    {
        std::vector<int> v{ 0, 6, 2, 3, 4, 5, 6, 4, 6, 7, 8 };
        // 返回值为 6 的元素的个数
        auto n = std::count(std::begin(v), std::end(v), 6);
        std::cout << n << '\n';
        return 0;
    }

    3

  • 复杂度

    O(n)n 为 last first,比较所有元素。

    数据争用相关

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

    异常安全性相关

    如果比较操作(Comparision)或操作某个迭代器抛异常,该函数才会抛异常。

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