Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm multiset::count() trong C++ STL

std::multiset::count(key) trả về số lượng phần tử trong multiset có khóa bằng key. Vì multiset cho phép trùng lặp, hàm này rất hữu ích để đếm tần suất.

Cú pháp

size_type count(const key_type& key) const;

Đặc điểm

  • Trả về số lượng phần tử khớp với key (có thể là 0).
  • Độ phức tạp: O(log n + count) - tìm kiếm log n + đếm các phần tử liên tiếp.
  • Không làm thay đổi multiset.

Ví dụ 1: Đếm tần suất

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

int main() {
    int arr[] = {1, 2, 3, 1, 1, 1};
    multiset<int> ms(arr, arr + 6); // {1, 1, 1, 1, 2, 3}
    
    cout << "Danh sách: ";
    for (int x : ms) cout << x << ' ';
    cout << '\n';
    
    cout << "Số lần xuất hiện của 1: " << ms.count(1) << '\n'; // 4
    cout << "Số lần xuất hiện của 2: " << ms.count(2) << '\n'; // 1
    cout << "Số lần xuất hiện của 5: " << ms.count(5) << '\n'; // 0
    
    return 0;
}

Đầu ra

Danh sách: 1 1 1 1 2 3
Số lần xuất hiện của 1: 4
Số lần xuất hiện của 2: 1
Số lần xuất hiện của 5: 0

Ví dụ 2: Đếm nhiều giá trị

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

int main() {
    int arr[] = {1, 2, 3, 1, 1, 1, 2, 2};
    multiset<int> ms(arr, arr + 8); // {1,1,1,1,2,2,2,3}
    
    cout << "Danh sách: ";
    for (int x : ms) cout << x << ' ';
    cout << '\n';
    
    cout << "1 xuất hiện: " << ms.count(1) << " lần\n"; // 4
    cout << "2 xuất hiện: " << ms.count(2) << " lần\n"; // 3
    cout << "3 xuất hiện: " << ms.count(3) << " lần\n"; // 1
    
    return 0;
}

Đầu ra

Danh sách: 1 1 1 1 2 2 2 3
1 xuất hiện: 4 lần
2 xuất hiện: 3 lần
3 xuất hiện: 1 lần

So sánh với find() và equal_range()

HàmTrả vềĐộ phức tạpDùng khi
count(k)Số lượng (size_type)O(log n + count)Chỉ cần biết số lượng
find(k)Iterator đến phần tử đầu tiênO(log n)Cần iterator để thao tác
equal_range(k)Pair (range)O(log n)Cần duyệt tất cả phần tử = k

Ví dụ dùng equal_range() để duyệt

auto range = ms.equal_range(1);
for (auto it = range.first; it != range.second; ++it) {
    cout << *it << ' '; // In tất cả các 1
}

Lưu ý

  • Với set (không trùng lặp), count() chỉ trả về 0 hoặc 1.
  • Để đếm tần suất nhiều giá trị, cân nhắc std::unordered_map<Key, int> (O(1) trung bình).