📜  C++ 中的 map 与 unordered_map(1)

📅  最后修改于: 2023-12-03 15:13:58.485000             🧑  作者: Mango

C++ 中的 map 与 unordered_map

介绍

在 C++ 中,mapunordered_map 是两个用于存储键值对数据的容器。它们都是关联容器,可根据键查找值。然而,在内部实现和性能方面有所不同。

  • map 是基于红黑树实现的有序容器,它按键的升序进行排序,并且提供了快速的查找、插入和删除操作。
  • unordered_map 是基于哈希表实现的无序容器,它使用哈希函数将键直接映射到桶上,并且提供了近似常数时间的查找、插入和删除操作。
基本操作
创建容器

map:

#include <map>

std::map<int, std::string> myMap;  // 创建空的 map

unordered_map:

#include <unordered_map>

std::unordered_map<int, std::string> myUnorderedMap;  // 创建空的 unordered_map
插入元素

map:

myMap.insert(std::make_pair(1, "apple"));  // 使用 insert 函数插入键值对
myMap[2] = "banana";  // 使用下标运算符 [] 插入键值对

unordered_map:

myUnorderedMap.insert(std::make_pair(1, "apple"));
myUnorderedMap.insert(std::make_pair(2, "banana"));
查找元素

map:

auto iter = myMap.find(1);  // 使用 find 函数查找键为 1 的元素
if (iter != myMap.end()) {
    std::cout << "Value: " << iter->second << std::endl;  // 输出值
}

unordered_map:

auto iter = myUnorderedMap.find(1);
if (iter != myUnorderedMap.end()) {
    std::cout << "Value: " << iter->second << std::endl;
}
删除元素

map:

myMap.erase(2);  // 使用 erase 函数删除键为 2 的元素

unordered_map:

myUnorderedMap.erase(2);
遍历容器

map:

for (const auto& element : myMap) {
    std::cout << "Key: " << element.first << ", Value: " << element.second << std::endl;
}

unordered_map:

for (const auto& element : myUnorderedMap) {
    std::cout << "Key: " << element.first << ", Value: " << element.second << std::endl;
}
区别与选择
  • 如果需要有序的键值对,并且对性能要求不是特别高,可以选择 map
  • 如果对键值对的顺序没有要求,但对性能要求较高,可以选择 unordered_map
  • 在大多数情况下,unordered_map 的性能比 map 更好,因为哈希表在大多数情况下具有更好的平均时间复杂度。

需要注意的是,unordered_map 的键类型必须具有哈希函数,即 std::hash<T> 的特化版本,或者自定义的哈希函数。

总结

mapunordered_map 在 C++ 中都是很有用的关联容器,用于存储键值对数据。它们在内部实现和性能方面有所区别,开发人员可以根据具体需求选择适当的容器。无论是有序容器的 map,还是无序容器的 unordered_map,对于程序员来说都是强大而常用的工具。