📅  最后修改于: 2023-12-03 15:13:58.485000             🧑  作者: Mango
在 C++ 中,map
和 unordered_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>
的特化版本,或者自定义的哈希函数。
map
和 unordered_map
在 C++ 中都是很有用的关联容器,用于存储键值对数据。它们在内部实现和性能方面有所区别,开发人员可以根据具体需求选择适当的容器。无论是有序容器的 map
,还是无序容器的 unordered_map
,对于程序员来说都是强大而常用的工具。