- algorithm[meta header]
- std[meta namespace]
- function template[meta id-type]
namespace std {
template <class InputIterator, class Predicate>
typename iterator_traits<InputIterator>::difference_type
count_if(InputIterator first,
InputIterator last,
Predicate pred); // (1) C++03
template <class InputIterator, class Predicate>
constexpr typename iterator_traits<InputIterator>::difference_type
count_if(InputIterator first,
InputIterator last,
Predicate pred); // (1) C++20
template<class ExecutionPolicy, class ForwardIterator, class Predicate>
typename iterator_traits<ForwardIterator>::difference_type
count_if(ExecutionPolicy&& exec,
ForwardIterator first,
ForwardIterator last,
Predicate pred); // (2) C++17
}
- iterator_traits[link /reference/iterator/iterator_traits.md]
条件を満たしている要素の数を数える。
[first,last)
内のイテレータ i
について、pred(*i) != false
であるイテレータの数を返す
正確に last - first
回の述語の適用を行う
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = { 1,4,3,3,1,2,2,1 };
// 値が 1 または 3 の要素がいくつあるかを数える
auto count = std::count_if(v.begin(), v.end(), [](int x) { return x == 1 || x == 3; });
std::cout << "count of 1 or 3: " << count << std::endl;
}
- std::count_if[color ff0000]
count of 1 or 3: 5
template <class InputIterator, class Predicate>
typename iterator_traits<InputIterator>::difference_type
count_if(InputIterator first, InputIterator last, Predicate pred) {
typename iterator_traits<InputIterator>::difference_type ret = 0;
for ( ; first != last; ++first)
if (pred(*first)) ret++;
return ret;
}