unordered_multimap
详解与代码示例
unordered_multimap
是 C++ 标准库中的一个关联容器,它允许存储键值对,并且一个键可以对应多个值。与 unordered_map
不同,unordered_multimap
允许键的重复,并且不保证元素的顺序。它基于哈希表实现,因此提供了快速的查找、插入和删除操作。
基本特性
- 键的重复性:允许一个键对应多个值。
- 无序性:元素不按照键的顺序存储。
- 哈希表实现:使用哈希函数将键映射到桶中,以支持快速的查找操作。
- 复杂度:平均情况下,查找、插入和删除操作的时间复杂度为 O(1)。
成员函数
unordered_multimap
提供了与 unordered_map
类似的成员函数,包括:
insert
:插入键值对。erase
:删除指定元素或指定键的所有元素。find
:查找指定键的元素。count
:返回指定键的元素数量。equal_range
:返回指定键的元素范围。clear
:清空容器。size
:返回容器中的元素数量。empty
:检查容器是否为空。begin
和end
:返回指向容器开始和结束位置的迭代器。
代码示例
以下是一个详细的代码示例,展示了如何使用 unordered_multimap
:
#include <iostream>
#include <unordered_map>
#include <string>
int main() {
// 创建一个 unordered_multimap 容器,键为 std::string,值为 int
std::unordered_multimap<std::string, int> umap;
// 插入键值对
umap.insert({"apple", 10});
umap.insert({"banana", 20});
umap.insert({"apple", 15}); // 允许键的重复
umap.insert({"orange", 30});
// 查找键为 "apple" 的元素
auto range = umap.equal_range("apple");
for (auto it = range.first; it != range.second; ++it) {
std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl;
}
// 使用 find 方法查找键为 "banana" 的元素
auto it = umap.find("banana");
if (it != umap.end()) {
std::cout << "Found key 'banana' with value: " << it->second << std::endl;
}
// 使用 count 方法获取键为 "apple" 的元素数量
std::cout << "Number of elements with key 'apple': " << umap.count("apple") << std::endl;
// 删除键为 "apple" 的所有元素
umap.erase("apple");
// 输出删除后的容器大小
std::cout << "Size of unordered_multimap after erasing 'apple': " << umap.size() << std::endl;
// 清空容器
umap.clear();
std::cout << "Is unordered_multimap empty? " << (umap.empty() ? "Yes" : "No") << std::endl;
return 0;
}
输出结果
Key: apple, Value: 10
Key: apple, Value: 15
Found key 'banana' with value: 20
Number of elements with key 'apple': 2
Size of unordered_multimap after erasing 'apple': 2
Is unordered_multimap empty? Yes
注意事项
- 哈希函数:
unordered_multimap
使用默认的哈希函数std::hash<Key>
来计算键的哈希值。如果需要自定义哈希函数,可以在模板参数中指定。 - 负载因子:负载因子是元素数量与桶数量的比值。当负载因子超过最大负载因子(默认为 1.0)时,
unordered_multimap
会自动进行 rehash 操作以增加桶数量。可以通过load_factor()
方法获取当前负载因子,通过max_load_factor()
方法设置最大负载因子。 - 迭代器失效:在 rehash 操作后,
unordered_multimap
的迭代器可能会失效。因此,在重新哈希后仍需要继续迭代容器时,需要重新获取迭代器。 - 异常处理:使用
insert
方法插入元素时,如果发生内存分配失败等异常情况,会抛出异常。使用at
方法访问元素时,如果键不存在,会抛出std::out_of_range
异常。
通过这篇文章和代码示例,你应该对 unordered_multimap
有了更深入的了解,并能够在你的 C++ 项目中有效地使用它。
何曾参静谧的博客(✅关注、👍点赞、⭐收藏、🎠转发)