「C/C++」C++ STL容器库 之 std::unordered_multimap 可重复无序键值对的集合容器

在这里插入图片描述

✨博客主页
何曾参静谧的博客(✅关注、👍点赞、⭐收藏、🎠转发)
📚全部专栏(专栏会有变化,以最新发布为准)
「Win」Windows程序设计「IDE」集成开发环境「定制」定制开发集合
「C/C++」C/C++程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「UG/NX」BlockUI集合
「Py」Python程序设计「Math」探秘数学世界「PK」Parasolid函数说明
「Web」前后端全栈开发「En」英语从零到一👍占位符
「AI」人工智能大模型

unordered_multimap 详解与代码示例

unordered_multimap 是 C++ 标准库中的一个关联容器,它允许存储键值对,并且一个键可以对应多个值。与 unordered_map 不同,unordered_multimap 允许键的重复,并且不保证元素的顺序。它基于哈希表实现,因此提供了快速的查找、插入和删除操作。

基本特性

  • 键的重复性:允许一个键对应多个值。
  • 无序性:元素不按照键的顺序存储。
  • 哈希表实现:使用哈希函数将键映射到桶中,以支持快速的查找操作。
  • 复杂度:平均情况下,查找、插入和删除操作的时间复杂度为 O(1)。

成员函数

unordered_multimap 提供了与 unordered_map 类似的成员函数,包括:

  • insert:插入键值对。
  • erase:删除指定元素或指定键的所有元素。
  • find:查找指定键的元素。
  • count:返回指定键的元素数量。
  • equal_range:返回指定键的元素范围。
  • clear:清空容器。
  • size:返回容器中的元素数量。
  • empty:检查容器是否为空。
  • beginend:返回指向容器开始和结束位置的迭代器。

代码示例

以下是一个详细的代码示例,展示了如何使用 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++ 项目中有效地使用它。

何曾参静谧的博客(✅关注、👍点赞、⭐收藏、🎠转发)


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何曾参静谧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值