C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のSTLを使ってバイナリ配列内の1と0の個数を数える方法

このチュートリアルでは、C++のSTL(標準テンプレートライブラリ)を使用して、バイナリ配列に含まれる「1」と「0」の個数を数えるプログラムについて解説します。

具体的には、0と1のみで構成された配列が与えられ、その中に「1」がいくつ、「0」がいくつ含まれているかを求めるのが目的です。

実装のポイント

この問題は、STLが提供する count_if() 関数を使うことで、非常にシンプルに解決できます。count_if() は、指定した範囲内の要素のうち、条件を満たす要素の個数を返すアルゴリズムです。

まず、要素が「1」であるかどうかを判定する関数を用意し、それを count_if() の第3引数として渡します。これにより「1」の個数が取得でき、配列全体のサイズからその値を引けば「0」の個数も求められます。

サンプルコード

#include <bits/stdc++.h>
using namespace std;

// 要素が1かどうかを判定する関数
bool isOne(int i){
    if (i == 1)
        return true;
    else
        return false;
}

int main(){
    int a[] = { 1, 0, 0, 1, 0, 0, 1 };
    int n = sizeof(a) / sizeof(a[0]);

    // 条件を満たす要素(1)の個数をカウント
    int count_of_one = count_if(a, a + n, isOne);

    cout << "1's: " << count_of_one << endl;
    cout << "0's: " << (n - count_of_one) << endl;

    return 0;
}

実行結果

1's: 3
0's: 4

コードの解説

  • isOne関数:引数として受け取った整数が「1」であれば true を、そうでなければ false を返します。この関数が count_if() の判定条件として機能します。
  • sizeof(a) / sizeof(a[0]):配列全体のバイトサイズを1要素分のサイズで割ることで、配列の要素数を計算しています。
  • count_if(a, a + n, isOne):配列の先頭から末尾までの範囲に対して isOne を適用し、「1」の個数を返します。
  • 0の個数:バイナリ配列には0と1しか存在しないため、「配列の総要素数 − 1の個数」で「0」の個数を算出できます。

補足:ラムダ式を使った書き方

C++11以降では、ラムダ式を使うことで判定用の関数を別途定義せずに、より簡潔に記述することもできます。

int count_of_one = count_if(a, a + n, [](int i){ return i == 1; });

このようにSTLのアルゴリズムを活用すると、ループ処理を手書きする必要がなくなり、コードの可読性と保守性が向上します。ぜひ活用してみてください。

  1. C++とOpenCVを使って画像内の顔の数を数える方法

    OpenCVを利用すれば、画像に写っている顔の数を数えるのはとても簡単です。実は、前章で作成した顔検出プログラムには、すでに検出した顔の数の情報が含まれています。その情報は faces.size() というコードで取得でき、このコードは整数値(int型)を返します。例えば、int x = faces.size(); と記述すれば、変数 x には画像から検出された顔の数が格納されます。以下のプログラムは、指定した画像から顔の数を計算し、その結果をコンソール画面に表示するものです。サンプルコード#include<iostream> #include<opencv2/highgui

  2. C++とOpenCVで動画の総フレーム数をカウント・取得する方法

    はじめにこの記事では、OpenCVを使って動画の総フレーム数を求める方法を解説します。OpenCVを利用すれば、動画の総フレーム数を数えて表示するのは非常に簡単です。ただし、一点だけ注意が必要です。リアルタイム映像(Webカメラの映像など)のフレーム数は数えることができません。リアルタイム映像には決まったフレーム数が存在しないためです。以下のプログラムでは、動画ファイルの総フレーム数をカウントし、コンソール画面に表示します。サンプルコード#include<opencv2/opencv.hpp> #include<iostream> using namespace std