目次
はじめに
C++でvector
などのコンテナを扱う際、「指定した値と完全に一致する要素の数」や、「特定の条件を満たす要素の数」を数えたい場面は非常に多くあります。
for
ループで自力で数えることもできますが、C++の標準ライブラリ <algorithm>
には、このための専用関数が用意されています。
std::count
: 特定の値に一致する要素の数を数える。std::count_if
: ラムダ式などで指定した条件に一致する要素の数を数える。
この記事では、これら2つの関数を使って、コンテナの要素数を効率的にカウントする方法を解説します。
count
/ count_if
を使ったサンプルコード
このコードは、vector
に格納された点数のリストから、「100点だった人数」と「80点以上だった人数」を、それぞれの関数を使って数えます。
完成コード
#include <iostream>
#include <vector>
#include <algorithm> // count, count_if
using namespace std;
int main() {
vector<int> scores = {85, 100, 72, 90, 100, 68};
// --- 1. count: 特定の値に一致する要素の数を数える ---
int perfect_score_count = count(scores.begin(), scores.end(), 100);
cout << "100点を取った人数: " << perfect_score_count << " 人" << endl;
// --- 2. count_if: 条件に一致する要素の数を数える ---
// 条件: 80点以上
int high_scorers_count = count_if(scores.begin(), scores.end(), [](int score){ return score >= 80; });
cout << "80点以上を取った人数: " << high_scorers_count << " 人" << endl;
return 0;
}
実行結果
100点を取った人数: 2 人
80点以上を取った人数: 4 人
コードの解説
1. std::count
count(範囲の開始イテレータ, 範囲の終了イテレータ, 探す値);
- 機能: 指定された範囲内に、第3引数で指定した値と完全に一致する要素がいくつあるかを数え、その個数を返します。
2. std::count_if
count_if(範囲の開始イテレータ, 範囲の終了イテレータ, 条件);
- 機能: 指定された範囲内の各要素に対して、第3引数で指定した**条件(述語)**を適用し、その条件が
true
を返した要素の個数を数えます。 [](int score){ return score >= 80; }
: このラムダ式は、「int
型のscore
を受け取り、もしscore
が80
以上ならtrue
を返す」という条件を定義しています。
map
やset
の場合
std::map
やstd::set
のような連想コンテナには、特定のキーの数を数えるための、より高速な**.count()
メンバ関数**が用意されています。
#include <map>
// ...
map<string, int> fruits_stock = {{"apple", 5}, {"orange", 5}};
// .count()メンバ関数は、指定したキーの数を返す
cout << "appleの数: " << fruits_stock.count("apple") << endl; // -> 1
連想コンテナで特定のキーの数を数える場合は、std::count
ではなく、こちらの.count()
メンバ関数を使うのが定石です。
まとめ
今回は、C++でコンテナの要素数を数えるためのstd::count
とstd::count_if
を解説しました。
std::count
: 値で数える。std::count_if
: 条件で数える。- 連想コンテナの場合は、高速な**
.count()
メンバ関数**を使う。
手動でループを書くよりも、これらの標準アルゴリズム関数を使った方が、コードが簡潔で意図が明確になり、バグが入り込む余地も少なくなります。