c++ | 关联式容器 multimap

92 篇文章 0 订阅
本文详细介绍了C++标准库中的std::multimap和std::unordered_map两种容器,比较了它们的数据结构(红黑树vs哈希表)、特性(元素顺序、重复键处理、查找效率、内存占用)、适用场景,帮助开发者根据需求选择合适的容器。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <map>

int main() {
    std::multimap<int, std::string> tasks;

    tasks.insert({2, "Task 1"});
    tasks.insert({1, "Task 2"});
    tasks.insert({2, "Task 3"});
    tasks.insert({3, "Task 4"});
    tasks.insert({1, "Task 5"});

    std::cout << "Tasks in priority order:\n";
    for (const auto& task : tasks) {
        std::cout << "Priority " << task.first << ": " << task.second << std::endl;
    }

    return 0;
}
Priority 1: Task 2
Priority 1: Task 5
Priority 2: Task 1
Priority 2: Task 3
Priority 3: Task 4

再说结论,它和unordered_map 的区别,就是 前者可以多对多
一个key 可以对多个 value ,多个value 也可以对同一个key
而后者只能一对一或者多对一,一个key 只能映射一个结果,所以不存在元素中出现相同的key

底层数据结构:

std::multimap 使用红黑树(Red-Black Tree)作为底层数据结构,保持元素有序。
std::unordered_map 使用哈希表(Hash Table)作为底层数据结构,元素无序存储。
元素的唯一性:

std::multimap 允许存储键值相同的多个元素。
std::unordered_map 不允许存储键值相同的多个元素,每个键只能对应一个值,因为它使用哈希表,哈希表中的键是唯一的。
查找效率:

在 std::multimap 中,查找操作的时间复杂度为 O(log n),因为底层是红黑树,保持了元素的有序性。
在 std::unordered_map 中,查找操作的平均时间复杂度为 O(1),但最坏情况下会退化为 O(n),取决于哈希函数的质量和哈希表的负载因子。
内存占用:

由于 std::unordered_map 使用哈希表,它可能会消耗更多的内存空间来存储元素,因为需要考虑哈希碰撞和哈希表的扩容。
std::multimap 使用红黑树,相比之下可能会更节省一些内存,但它也需要一定的额外空间来存储树的结构。
顺序性:

std::multimap 保持了元素的插入顺序,因为它是基于红黑树的有序容器。
std::unordered_map 不保持元素的顺序,因为它是基于哈希表的无序容器。
综上所述,std::multimap 适合需要存储键值对,并且可能有重复键的情况,而且需要保持元素有序的场景;而 std::unordered_map 适合需要快速查找,并且不需要保持元素顺序的情况。选择哪种容器取决于具体的需求和性能要求。
#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    std::unordered_map<std::string, std::string> phonebook;

    phonebook["Alice"] = "123456";
    phonebook["Bob"] = "654321";
    phonebook["Charlie"] = "987654";

    std::string name = "Bob";
    std::cout << "Phone number of " << name << ": " << phonebook[name] << std::endl;

    return 0;
}
Phone number of Bob: 654321
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值