哈希表是一个很常见也很好用的数据结构,在平时刷题时会经常遇到有时候使用起来也很事半功倍,在平时哈希表主要使用两种:unordered_set和unordered_map
哈希表的英文叫 Hash Table,也可以称为散列表或者 Hash 表。
哈希表存储的是由键(key)和值(value)组成的数据。 例如,我们将每个人的性别作为数据进行存储,键为人名,值为对应的性别,其中 M 表示性别为男,F 表示性别为女。
总结就是哈希表一般是用来快速判断某个元素是否出现在这个集合里
unordered_map内部实现了一个 哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此, 其元素的排列顺序是无序的
unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value。
key值应该是唯一的,key和value的数据类型可以不相同。
那么对于查找类的问题,通常都会考虑使用unordered_map
不再以键值对的形式存储数据,而是直接存储数据的值。
容器内部存储的各个元素的值都互不相等,且不能被修改
插入、删除、查找元素的时间复杂度是常量的
那么一般在仅需要保存互异的元素而不需要排序和只需要获取单个元素而不需要遍历下使用它
#include
#include
int main() {
unordered_map<int, int> map; // 声明一个键和值都为int类型的unordered_map
return 0;
}
在上面的示例中,声明了一个名为map的unordered_map,其中键和值都是int类型。这里是声明了一个没有任何元素的哈希表,需要进一步添加元素才能使用
#include
int main() {
unordered_map<int, sstring> myMap; // 声明一个键为int类型、值为string类型的unordered_map
// 添加元素
myMap[1] = "Hello";
myMap[2] = "World";
// 访问元素
cout << myMap[1] << endl; // 输出: Hello
return 0;
}
在上面的示例中,声明了一个unordered_map,其键的类型为int,值的类型为string。然后,我们通过myMap[键]的方式添加和访问元素。那么,对于不存在的键,使用myMap[键]会创建一个新的键值对并将默认值赋给它
unordered_map<string, int> myMap;
myMap.insert({"apple", 5});
unordered_map::insert: 这个函数用于向哈希表中插入一个键值对。在上面的示例中,创建了一个空的 unordered_map 对象 myMap,然后使用 insert 函数将键为 “apple”,值为 5 的键值对插入到 myMap 中
unordered_map<string, int> myMap = {{"apple", 5}, {"banana", 10}};
myMap.erase("apple");
unordered_map::erase: 这个函数用于从哈希表中删除一个键值对。在上面示例中,首先创建了一个 unordered_map 对象 myMap,并初始化了两个键值对。接下来,使用 erase 函数删除了键为 “apple” 的键值对
unordered_map<string, int> myMap = {{"apple", 5}, {"banana", 10}};
auto iter = myMap.find("apple");
if (iter != myMap.end()) {
cout << "Value: " << iter->second << endl; // 输出 "Value: 5"
}
unordered_map::find: 这个函数用于在哈希表中查找某个键,并返回指向对应值的迭代器。在上面示例中,首先创建了一个unordered_map 对象 myMap,并初始化了两个键值对。接下来,使用 find 函数查找键为 “apple” 的键值对,并将返回的迭代器保存在 iter 中。如果找到了对应的键值对,则输出其值
unordered_map<string, int> myMap = {{"apple", 5}, {"banana", 10}};
if (myMap.count("apple") > 0) {
cout << "Found apple!" << endl;
}
unordered_map::count: 这个函数用于判断哈希表中是否存在某个键值对。在上面示例中,首先创建了一个 unordered_map 对象 myMap,并初始化了两个键值对。然后使用 count 函数判断键为 “apple” 的键值对是否存在,如果存在则输出 “Found apple!”
unordered_map<string, int> myMap = {{"apple", 5}, {"banana", 10}};
cout << "Size: " << myMap.size() << endl; // 输出 "Size: 2"
unordered_map::size: 这个函数用于返回哈希表中元素的个数。在示例中,首先创建了一个 unordered_map 对象 myMap,并初始化了两个键值对。然后使用 size 函数获取 myMap 中元素的个数,并输出结果
unordered_map<string, int> myMap = {{"apple", 5}, {"banana", 10}};
myMap.clear();
unordered_map::clear: 这个函数用于清空哈希表中的所有元素。在示例中,首先创建了一个 unordered_map 对象 myMap,并初始化了两个键值对。然后使用 clear 函数清空 myMap 中的所有元素
unordered_map<int, string> myMap;
cout << "Is myMap empty? " << boolalpha << myMap.empty() << endl; // 输出: Is myMap empty? true
myMap[1] = "Hello";
myMap[2] = "World";
std::cout << "Is myMap empty now? " << boolalpha << myMap.empty() << :endl; // 输出: Is myMap empty now? false
在上面的示例中,我们创建了一个名为myMap的unordered_map,然后使用empty()函数来检查它是否为空。由于我们还没有向哈希表中添加任何元素,因此它是空的,empty()函数返回true。
接着,我们向哈希表中添加了两个元素,并再次调用empty()函数进行检查。此时哈希表已经不为空,empty()函数返回false。
需要注意的是,empty()函数不会改变哈希表本身,它只是返回当前哈希表是否为空的信息
vector<int> vec = {1, 2, 3, 4, 5};
// 使用 begin 和 end 遍历 vector
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " ";
}
cout << endl;
在这个示例中,创建了一个包含 5 个整数的 array,并使用 begin 和 end 获取迭代器,然后使用迭代器遍历整个数组并输出每个元素。
array 是一个固定大小的数组容器,类似于内置数组。使用 begin 和 end 可以方便地遍历 array 中的元素
以上就是哈希表的基本用法了,初步了解之后可以多刷题巩固并深入