#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