最終更新日時(UTC):
が更新

履歴 編集

function template
<algorithm>

std::count_if

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
}

概要

イテレータ範囲[first, last)から、条件を満たしている要素の数を数える。

戻り値

イテレータ範囲[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;
}

出力

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

参照