在C++标准模板库(STL)中,unordered_multiset 是一个非常实用的容器,特别适合需要存储重复元素且不关心顺序的场景。本文将从零开始,手把手教你掌握 C++ unordered_multiset 的基本概念、常用操作和实际应用,即使你是编程小白也能轻松上手!
unordered_multiset 是 C++11 引入的一种关联容器,属于 C++ STL容器 家族。它基于哈希表(Hash Table)实现,允许存储重复元素,且元素无序存储。
与 set 和 unordered_set 不同的是:
set:有序、不允许重复unordered_set:无序、不允许重复unordered_multiset:无序、允许重复 ✅
首先,你需要包含头文件:
#include <unordered_set>using namespace std; // 空的 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()); unordered_multiset<int> ms;ms.insert(10);ms.insert(20);ms.insert(10); // 允许重复!// 批量插入ms.insert({30, 10, 40}); 由于元素无序,我们通常使用迭代器遍历:
// 遍历所有元素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; // 删除所有值为 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。
本文由主机测评网于2025-12-24发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251212140.html