unordered_map
和 map
都是 C++ STL 中的关联数组容器,用于存储键值对(key-value pairs)。其中,键是唯一的,而值则可以重复。
它们的主要区别在于实现方式不同。map
实现了红黑树,因此可以自动按照键值排序,而且在查找、插入和删除操作中具有较高的效率。但是,红黑树的构建和维护需要较多的时间和空间开销。
相比之下,unordered_map
实现了哈希表,因此在查找、插入和删除操作中具有非常高的效率。但是,由于哈希函数的存在,它的元素没有固定的顺序,并且在处理冲突时需要进行额外的开销。
因此,如果需要按照键值排序或需要保证元素顺序稳定,可以使用 map
;而如果需要快速的查找、插入和删除操作,可以使用 unordered_map
。
另外,unordered_map
的内存占用通常比 map
大,因为它需要更多的哈希桶来减少冲突。在某些情况下,也可以使用 std::unordered_set
或 std::set
,它们分别实现了哈希表和红黑树,用于存储不重复的元素。
以下是 unordered_map
和 map
的代码示例,展示它们在使用上的区别:
#include <iostream>
#include <map>
#include <unordered_map>int main() {// 使用 map 存储键值对,会自动按照键值排序std::map<std::string, int> myMap;myMap["apple"] = 3;myMap["banana"] = 2;myMap["orange"] = 5;myMap["pear"] = 7;// 输出 map 中的元素for (auto it = myMap.begin(); it != myMap.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;}// 使用 unordered_map 存储键值对,元素没有固定的顺序std::unordered_map<std::string, int> myUnorderedMap;myUnorderedMap["apple"] = 3;myUnorderedMap["banana"] = 2;myUnorderedMap["orange"] = 5;myUnorderedMap["pear"] = 7;// 输出 unordered_map 中的元素for (auto it = myUnorderedMap.begin(); it != myUnorderedMap.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;}return 0;
}
输出结果可能类似于以下内容:
apple: 3
banana: 2
orange: 5
pear: 7
banana: 2
apple: 3
pear: 7
orange: 5
可以看到,使用 map
存储键值对时,元素会自动按照键值排序;而使用 unordered_map
存储键值对时,元素没有固定的顺序。