function template
<algorithm>

std::count_if

template <class InputIterator, class Predicate>
  typename iterator_traits<InputIterator>::difference_type
    count_if (InputIterator first, InputIterator last, UnaryPredicate pred);
Return number of elements in range satisfying condition
Returns the number of elements in the range [first,last) for which pred is true.

The behavior of this function template is equivalent to:
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;
}


Parameters

first, last
Input iterators to the initial and final positions of the sequence of elements. The range used is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.
pred
Unary function that accepts an element in the range as argument, and returns a value convertible to bool. The value returned indicates whether the element is counted by this function.
The function shall not modify its argument.
This can either be a function pointer or a function object.

Return value

The number of elements in the range [first,last) for which pred does not return false.
The return type (iterator_traits<InputIterator>::difference_type) is a signed integral type.

Example

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;
}


Output:
myvector contains 5 odd values.

Complexity

Linear in the distance between first and last: Calls pred once for each element.

Data races

The objects in the range [first,last) are accessed (each object is accessed exactly once).

Exceptions

Throws if pred trhows or if any of the operations on iterators throws.
Note that invalid arguments cause undefined behavior.

See also