std::unordered_map
是 C++ 标准库中的一个容器,用于存储键值对(key-value pairs)。它提供了基于哈希表的实现,可以在常数时间内进行大部分插入、删除和查找操作。以下是关于 std::unordered_map
的用法,包括基本操作和示例代码。
1. 头文件
在使用 std::unordered_map
之前,需要包含相应的头文件:
#include <unordered_map>
2. 定义和初始化
可以使用以下方式定义和初始化 std::unordered_map
:
std::unordered_map<int, std::string> myMap; // 键为 int,值为 std::string
也可以使用初始化列表
std::unordered_map<int, std::string> myMap = {{1, "one"},{2, "two"},{3, "three"}
};
3. 基本操作
a. 插入元素
有几种方法可以插入元素:
myMap[4] = "four"; // 通过下标操作插入
myMap.insert({5, "five"}); // 使用 insert 方法
myMap.emplace(6, "six"); // 使用 emplace 直接构造对象
b. 查找元素
可以使用 find
方法或下标操作查找元素:
auto it = myMap.find(2); // 查找键为 2 的元素
if (it != myMap.end()) {std::cout << "Found: " << it->second << std::endl; // 输出对应的值
}std::string value = myMap[3]; // 直接访问,若键不存在则插入默认值
c. 删除元素
可以使用 erase
方法删除元素:
myMap.erase(2); // 删除键为 2 的元素
d. 遍历元素
可以使用范围 for 循环遍历 unordered_map
:
for (const auto& pair : myMap) {std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;
}
e. 获取大小和检查是否为空
可以使用 size
和 empty
方法:
std::cout << "Size: " << myMap.size() << std::endl; // 获取元素个数
if (myMap.empty()) {std::cout << "The map is empty." << std::endl;
}
4. 示例代码
以下是一个完整的示例代码,演示了 std::unordered_map
的基本用法:
#include <iostream>
#include <unordered_map>
#include <string>int main() {// 定义一个 unordered_mapstd::unordered_map<int, std::string> myMap;// 插入元素myMap[1] = "one";myMap.insert({2, "two"});myMap.emplace(3, "three");// 查找元素auto it = myMap.find(2);if (it != myMap.end()) {std::cout << "Found: " << it->second << std::endl;}// 遍历元素for (const auto& pair : myMap) {std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}// 删除元素myMap.erase(1);// 输出大小std::cout << "Size after deleting key 1: " << myMap.size() << std::endl;return 0;
}
5. 注意事项
-
哈希函数:
std::unordered_map
使用哈希函数来管理键的存储。默认情况下,使用标准的哈希函数,但可以提供自定义哈希函数。 -
迭代顺序:由于使用哈希表,
std::unordered_map
中元素的迭代顺序是不确定的。 -
内存使用:
std::unordered_map
可能会比std::map
使用更多的内存,因为它需要存储额外的信息(如哈希表的桶)。 -
异常安全:大多数操作在异常安全方面是强的,尤其是在插入和删除时。