C++ 中使用 map 和 unordered_map 的方法探索
在 C++ 中,map
和 unordered_map
是标准库中的两种关联容器,用于存储键值对。两者的主要区别在于底层实现和访问速度,以及元素存储的顺序。以下是它们的用法及一些特性探索:
map
定义:
#include <map>
std::map<int, std::string> myMap;
特性:
- 底层实现是红黑树。
- 元素是按照键值自动排序的。
- 查找、插入、删除时间复杂度为 O(log n)。
基本操作:
- 插入元素:
myMap.insert({1, "one"}); myMap[2] = "two";
- 访问元素:
std::string value = myMap[1]; // 如果键不存在,默认构造一个元素
- 查找元素:
auto it = myMap.find(1); if (it != myMap.end()) { // 键存在 }
- 删除元素:
myMap.erase(1);
- 插入元素:
迭代:
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
unordered_map
定义:
#include <unordered_map>
std::unordered_map<int, std::string> myUnorderedMap;
特性:
- 底层实现是哈希表。
- 元素不是按特定顺序存储,存储顺序可能和插入顺序不同。
- 查找、插入、删除时间复杂度平均为 O(1),但最坏情况下为 O(n)。
基本操作:
- 插入元素:
myUnorderedMap.insert({1, "one"}); myUnorderedMap[2] = "two";
- 访问元素:
std::string value = myUnorderedMap[1];
- 查找元素:
auto it = myUnorderedMap.find(1); if (it != myUnorderedMap.end()) { // 键存在 }
- 删除元素:
myUnorderedMap.erase(1);
- 插入元素:
迭代:
for (const auto& pair : myUnorderedMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
选择使用指南
使用
map
:- 需要按顺序访问元素。
- 对元素的稳定排序有要求。
使用
unordered_map
:- 关心操作的平均速度,希望达到最快的查找和插入性能。
- 对元素顺序没有要求。
在选择哪个容器时,需要根据应用场景决定,如果需要有序数据、并且对性能要求不特别高,可以选择 map
;如果需要最快速的查找和插入,并且数据顺序不重要,可以选择 unordered_map
。