当前位置:首页 > C++ > 正文

深入理解C++ unordered_multiset(C++哈希多重集合详解与实战教程)

在C++标准模板库(STL)中,unordered_multiset 是一个非常实用的容器,特别适合需要存储重复元素且不关心顺序的场景。本文将从零开始,手把手教你掌握 C++ unordered_multiset 的基本概念、常用操作和实际应用,即使你是编程小白也能轻松上手!

什么是 unordered_multiset?

unordered_multiset 是 C++11 引入的一种关联容器,属于 C++ STL容器 家族。它基于哈希表(Hash Table)实现,允许存储重复元素,且元素无序存储。

setunordered_set 不同的是:

  • set:有序、不允许重复
  • unordered_set:无序、不允许重复
  • unordered_multiset无序、允许重复
深入理解C++ unordered_multiset(C++哈希多重集合详解与实战教程) C++ unordered_multiset  C++哈希集合 unordered_multiset用法 STL容器 第1张

如何使用 unordered_multiset?

首先,你需要包含头文件:

#include <unordered_set>using namespace std;

1. 创建和初始化

// 空的 unordered_multisetunordered_multiset<int> nums;// 初始化列表unordered_multiset<string> words = {"apple", "banana", "apple", "cherry"};// 从 vector 初始化vector<int> v = {1, 2, 2, 3};unordered_multiset<int> ms(v.begin(), v.end());

2. 插入元素

unordered_multiset<int> ms;ms.insert(10);ms.insert(20);ms.insert(10); // 允许重复!// 批量插入ms.insert({30, 10, 40});

3. 查找和遍历

由于元素无序,我们通常使用迭代器遍历:

// 遍历所有元素for (const auto& elem : ms) {    cout << elem << " ";}// 查找某个值(返回所有匹配的迭代器范围)auto range = ms.equal_range(10);for (auto it = range.first; it != range.second; ++it) {    cout << *it << endl;}// 统计某个值出现的次数cout << "10 出现了 " << ms.count(10) << " 次" << endl;

4. 删除元素

// 删除所有值为 10 的元素ms.erase(10);// 删除单个迭代器指向的元素auto it = ms.find(20);if (it != ms.end()) {    ms.erase(it);}

性能特点

unordered_multiset 基于哈希表,因此平均时间复杂度为:

  • 插入:O(1) 平均
  • 查找:O(1) 平均
  • 删除:O(1) 平均

最坏情况下(哈希冲突严重)可能退化为 O(n),但实际开发中很少遇到。

完整示例:统计单词频率

下面是一个使用 unordered_multiset用法 的实用例子——统计输入中重复单词的出现次数:

#include <iostream>#include <unordered_set>#include <string>using namespace std;int main() {    unordered_multiset<string> words;    string word;    cout << "请输入单词(输入 'quit' 结束):\n";    while (cin >> word && word != "quit") {        words.insert(word);    }    // 输出每个单词及其出现次数    for (const auto& w : words) {        if (words.count(w) > 0) {            cout << w << " 出现了 " << words.count(w) << " 次\n";            // 避免重复输出相同单词            words.erase(w);        }    }    return 0;}

总结

unordered_multiset 是处理**允许重复、无需排序**数据的理想选择。作为 C++哈希集合 的重要成员,它在性能和功能之间取得了良好平衡。掌握它的基本操作(插入、查找、删除、遍历)后,你就能在项目中灵活运用这一强大的 C++ STL容器

提示:如果你不需要重复元素,请考虑使用 unordered_set;如果需要有序,请使用 multiset