unordered_map
是 C++ 标准库中的一种哈希表实现,它提供了基于键值对(key-value)的存储,提供了常数时间复杂度的查找、插入和删除键值对的操作。
初始化代码示例:
#include <unordered_map>
using namespace std;unordered_map<int, string> hashmap; // 初始化一个空的哈希表 mapunordered_map<int, string> hashmap{{1, "one"}, {2, "two"}, {3, "three"}};// 初始化一个包含一些键值对的哈希表 map
另外,在C++哈希表中,如果被访问的是一个不存在的键,它会自动创建这个键,对应的值时默认构造的值。
#include <iostream>
#include <unordered_map>
using namespace std;int main() {// 初始化哈希表unordered_map<int, string> hashmap{{1, "one"}, {2, "two"}, {3, "three"}};cout << hashmap.empty() << endl; // 检查哈希表是否为空,输出:0 (false)cout << hashmap.size() << endl; // 获取哈希表的大小,输出:3// 查找指定键是否存在// 注意 contains 方法是 C++20 新增的// 输出:Key 2 -> twoif (hashmap.contains(2)) {cout << "Key 2 -> " << hashmap[2] << endl;} else {cout << "Key 2 not found." << endl;}cout << hashmap[4] << endl; // 获取指定键对应的值,若不存在会返回默认构造的值// 输出空字符串hashmap[4] = "four"; // 插入一个新的键值对cout << hashmap[4] << endl; // 获取新插入的值,输出:fourhashmap.erase(3); // 删除键值对if (hashmap.contains(3)) {cout << "Key 3 -> " << hashmap[3] << endl;} else {cout << "Key 3 not found." << endl;}// 检查删除后键 3 是否存在// 输出:Key 3 not found.// 遍历哈希表// 输出(顺序可能不同):// 4 -> four// 2 -> two// 1 -> onefor (const auto &pair: hashmap) {cout << pair.first << " -> " << pair.second << endl;}// 特别注意,访问不存在的键会自动创建这个键unordered_map<int, string> hashmap2;// 键值对的数量是 0cout << hashmap2.size() << endl; // 0// 访问不存在的键,会自动创建这个键,对应的值是默认构造的值cout << hashmap2[1] << endl; // empty stringcout << hashmap2[2] << endl; // empty string// 现在键值对的数量是 2cout << hashmap2.size() << endl; // 2return 0;
}
哈希集合
unordered_set
是 C++ 标准库中的一种哈希集合实现,用于存储不重复的元素,常见使用场景是对元素进行去重。
初始化示例:
#include <unordered_set>
using namespace std;unordered_set<int> uset; // 初始化一个空的哈希集合 setunordered_set<int> uset{1, 2, 3, 4}; // 初始化一个包含一些元素的哈希集合 set
常用操作示例:
#include <iostream>
#include <unordered_set>
using namespace std;int main() {unordered_set<int> hashset{1, 2, 3, 4}; // 初始化哈希集合cout << hashset.empty() << endl; // 检查哈希集合是否为空,输出:0 (false)cout << hashset.size() << endl; // 获取哈希集合的大小,输出:4// 查找指定元素是否存在// 输出:Element 3 found.if (hashset.contains(3)) {cout << "Element 3 found." << endl;} else {cout << "Element 3 not found." << endl;}// 插入一个新的元素hashset.insert(5);// 删除一个元素hashset.erase(2);// 输出:Element 2 not found.if (hashset.contains(2)) {cout << "Element 2 found." << endl;} else {cout << "Element 2 not found." << endl;}// 遍历哈希集合// 输出(顺序可能不同):// 1// 3// 4// 5for (const auto &element : hashset) {cout << element << endl;}return 0;
}