【C++】std::count, std::count_if でコンテナの要素数を数える方法

目次

はじめに

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を受け取り、もしscore80以上ならtrueを返す」という条件を定義しています。

mapsetの場合

std::mapstd::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::countstd::count_ifを解説しました。

  • std::count: で数える。
  • std::count_if: 条件で数える。
  • 連想コンテナの場合は、高速な**.count()メンバ関数**を使う。

手動でループを書くよりも、これらの標準アルゴリズム関数を使った方が、コードが簡潔で意図が明確になり、バグが入り込む余地も少なくなります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次