Pertanyaan “berapa banyak yang X?” sangat umum dalam program: berapa siswa yang lulus, berapa transaksi di atas satu juta, berapa huruf vokal dalam kalimat. Header <algorithm> menjawabnya dengan dua algoritma sederhana: std::count untuk menghitung elemen yang sama dengan sebuah nilai, dan std::count_if untuk menghitung elemen yang membuat predikat menghasilkan true. Keduanya berjalan linier O(n), mengunjungi setiap elemen tepat satu kali, dan tidak mengubah data. Yang perlu diperhatikan justru tipe kembaliannya: ptrdiff_t, tipe yang mungkin belum sering kita pakai. Chapter ini membahas keduanya beserta alasan di balik pilihan tipe itu.

std::count: Menghitung Kemunculan Nilai #

std::count(first, last, nilai) mengembalikan jumlah elemen yang == nilai pada rentang [first, last). Karena hanya membutuhkan perbandingan kesamaan, ia bekerja di container apa pun — termasuk std::string, yang dari sudut pandang algoritma hanyalah container karakter.

cpp
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

int main() {
    std::vector<int> nilai = {70, 85, 70, 90, 70, 60};

    // std::count: berapa elemen yang bernilai sama
    auto n70 = std::count(nilai.begin(), nilai.end(), 70);
    std::cout << "Nilai 70 muncul : " << n70 << " kali\n";

    // count_if: hitung lewat kondisi lambda
    auto lulus = std::count_if(nilai.begin(), nilai.end(),
                               [](int x) { return x >= 75; });
    std::cout << "Nilai >= 75     : " << lulus << " kali\n";

    // count juga bekerja pada std::string (container of char)
    std::string kalimat = "pemrograman";
    auto nA = std::count(kalimat.begin(), kalimat.end(), 'a');
    std::cout << "Huruf a         : " << nA << " kali\n";

    // Tipe kembalian ptrdiff_t: tipe hasil selisih iterator
    std::ptrdiff_t total = std::count_if(nilai.begin(), nilai.end(),
                                         [](int x) { return x < 75; });
    std::cout << "Nilai < 75      : " << total << " kali\n";
    return 0;
}

Output yang Dihasilkan:

text
Nilai 70 muncul : 3 kali
Nilai >= 75     : 2 kali
Huruf a         : 2 kali
Nilai < 75      : 4 kali

Bedah baris demi baris:

  1. Baris 9-10 (std::count(..., 70)): nilai 70 muncul tiga kali pada data uji. Perhitungan dilakukan dengan operator==, sehingga tipe elemen hanya perlu punya operator itu.
  2. Baris 13-15 (std::count_if(...)): predikat lambda x >= 75 menghasilkan true untuk 85 dan 90, sehingga hitungannya dua. Predikat dapat ditulis sem kompleks apa pun — inilah daya tarik count_if.
  3. Baris 18-20: pada std::string "pemrograman", menghitung karakter 'a' menghasilkan dua. Container karakter memakai algoritma yang sama persis.
  4. Baris 23-26: hasil count_if ditampung secara eksplisit dalam variabel bertipe std::ptrdiff_t, lalu dicetak. Nilainya empat — elemen yang di bawah 75.

Tipe Kembalian ptrdiff_t #

Algoritma pencacah mengembalikan std::ptrdiff_t, bukan int. Tipe ini adalah tipe bertanda yang dipakai C++ untuk hasil selisih dua iterator — jumlah elemen antara dua posisi. Alasannya konsisten: hasil count setara dengan selisih antara end() dan hasil find_if yang sama, dan selisih iterator memang bertipe ptrdiff_t. Tipe ini biasanya 64-bit pada platform modern, sehingga aman untuk jumlah elemen yang sangat besar, di mana int 32-bit berpotensi meluap.

Dalam praktik, penulisan paling ringkas adalah auto n = std::count(...); — compiler menuliskan tipe yang benar untuk kita, dan kode tetap eksplisit soal maksudnya.

Pola Praktis di Sekitar count #

Beberapa pola yang sering muncul di kode nyata. Pertama, validasi: “semua elemen harus lolos syarat” dapat diuji dengan count_if(...) == v.size(). Kedua, deteksi kekosongan hasil: count(..., 0) memastikan tidak ada nilai nol sebelum pembagian. Ketiga, statistik sederhana: hitung yang lulus dan tidak lulus dengan dua panggilan count_if berbeda predikat.

count dan count_if melengkapi keluarga algoritma baca-saja (find, min_element, count). Selanjutnya kita masuk ke algoritma yang memindahkan data: keluarga std::copy dan std::move, beserta back_inserter yang membuat vector tujuan tumbuh otomatis.

Rujukan resmi: std::count dan count_if .