在C++标准模板库(STL)中,unordered_multiset 是 unordered_set 的一个变体,它允许容器中存在重复的元素。与 unordered_set 类似,unordered_multiset 也是基于哈希表实现的,提供近常数时间的查找、插入和删除操作。不同之处在于 unordered_multiset 不保证元素的唯一性。 unordered_multiset 定义在 <unordered_set> 头文件中。
主要特点- 重复元素:容器中允许存在值相同的元素。
- 无序性:元素不按特定顺序排列,是随机顺序。
- 快速操作:提供平均常数时间的查找、插入和删除操作。
- 哈希表:内部使用哈希表实现,需要提供元素的哈希值和相等比较。
主要操作- 构造:可以构造一个空的
unordered_multiset 或者使用一系列元素初始化。 - 插入:
insert 一个或多个新元素。与 unordered_set 不同,unordered_multiset 允许插入重复的元素。 - 查找:
find 查找一个元素。由于可能有多个匹配的元素,需要使用迭代器范围。 - 计数:
count 一个元素的个数,返回匹配该元素的元素数量。 - 删除:
- 大小:
size 返回容器中元素的数量。 - 范围:
equal_range 返回一个范围,包含所有与给定值相等的元素。
使用 std::unordered_multiset 的步骤- 包含头文件:使用 unordered_multiset 之前需要包含 <unordered_set> 头文件。
- 声明 unordered_multiset 实例:指定元素类型来声明 std::unordered_multiset 的实例。
- 初始化:可以默认构造一个空的 std::unordered_multiset,或者使用花括号 {} 初始化。
- 执行操作:使用 insert、find、erase 等方法操作无序多重集合。
示例代码#include <iostream>
#include <unordered_set>
int main() {
std::unordered_multiset<int> myUnorderedMultiSet;
// 向无序多重集合中插入元素
myUnorderedMultiSet.insert(10);
myUnorderedMultiSet.insert(5);
myUnorderedMultiSet.insert(10); // 允许插入重复元素
// 查找元素
auto range = myUnorderedMultiSet.equal_range(10);
for (auto it = range.first; it != range.second; ++it) {
std::cout << "Element found: " << *it << std::endl;
}
// 遍历无序多重集合并输出所有元素
for (int num : myUnorderedMultiSet) {
std::cout << num << ' ';
}
std::cout << std::endl;
// 删除特定元素
myUnorderedMultiSet.erase(5);
// 再次遍历无序多重集合并输出所有元素
for (int num : myUnorderedMultiSet) {
std::cout << num << ' ';
}
std::cout << std::endl;
return 0;
}
在这个示例中,我们创建了一个 std::unordered_multiset 的实例,并向其中插入了一些整数,包括重复的元素。然后,我们使用 equal_range 方法查找所有与特定值相等的元素,并遍历无序多重集合输出所有元素。接着,我们使用 erase 方法删除一个元素,并再次输出无序多重集合中的元素。 注意事项std::unordered_multiset 中的元素默认是按哈希值的顺序存储的,这不反映元素的任何自然顺序。std::unordered_multiset 允许有重复元素,count 方法可以返回匹配元素的数量。std::unordered_multiset 的迭代器在插入或删除操作后可能会变得无效,需要小心处理。- 在多线程环境中使用
std::unordered_multiset 时,需要注意线程安全问题,因为 std::unordered_multiset 并不是线程安全的。 std::unordered_multiset 的性能可能受到哈希函数质量和负载因子的影响。
std::unordered_multiset 是实现无序多重集合的便捷方式,适用于需要快速查找且不关心元素顺序,同时允许元素重复的场景。
(责任编辑:admin) |