函数模板
<algorithm>

std::count_if

template <class InputIterator, class UnaryPredicate>  typename iterator_traits<InputIterator>::difference_type    count_if (InputIterator first, InputIterator last, UnaryPredicate pred);
返回范围内满足条件的元素数量
返回范围 [first,last)pred 为 true 的元素数量。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
template <class InputIterator, class UnaryPredicate>
  typename iterator_traits<InputIterator>::difference_type
    count_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{
  typename iterator_traits<InputIterator>::difference_type ret = 0;
  while (first!=last) {
    if (pred(*first)) ++ret;
    ++first;
  }
  return ret;
}

参数

first, last
输入迭代器 指向序列的起始和结束位置。使用的范围是 [first,last),它包含 firstlast 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
pred
一元函数,它接受范围中的一个元素作为参数,并返回一个可转换为 bool 的值。返回值表示该元素是否被此函数计数。
该函数不得修改其参数。
这可以是一个函数指针,也可以是一个函数对象。

返回值

范围 [first,last)pred 不返回 false 的元素数量。
返回类型(iterator_traits<InputIterator>::difference_type)是带符号整数类型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// count_if example
#include <iostream>     // std::cout
#include <algorithm>    // std::count_if
#include <vector>       // std::vector

bool IsOdd (int i) { return ((i%2)==1); }

int main () {
  std::vector<int> myvector;
  for (int i=1; i<10; i++) myvector.push_back(i); // myvector: 1 2 3 4 5 6 7 8 9

  int mycount = count_if (myvector.begin(), myvector.end(), IsOdd);
  std::cout << "myvector contains " << mycount  << " odd values.\n";

  return 0;
}

输出
myvector contains 5 odd values.


复杂度

线性复杂度,与 firstlast 之间的 距离 成正比:对每个元素调用一次 pred

数据竞争

范围 [first,last) 中的对象将被访问(每个对象恰好访问一次)。

异常

如果 pred 抛出异常,或者对迭代器的任何操作抛出异常,则抛出异常。
请注意,无效参数会导致未定义行为

另见