unordered_map和hash的区别
时间: 2023-12-27 15:25:17 浏览: 27
unordered_map和hash_map都是用哈希表实现的关联容器,它们在功能上没有太大区别。然而,推荐使用unordered_map,因为它在C++11标准库中被录入,而hash_map并没有进入标准库。
unordered_map和hash_map的区别主要在于它们的实现和命名空间。unordered_map是C++标准库中的一个类模板,位于std命名空间中。而hash_map是一种非标准的实现,它可能在某些编译器或库中提供,但不是所有的编译器或库都支持。
因此,为了保证代码的可移植性和兼容性,推荐使用unordered_map。它是C++标准库中的一部分,可以在任何支持C++11标准的编译器中使用。
相关问题
C++中,unordered_map和hash_map
在C++中,unordered_map和hash_map都是用于实现哈希表的容器,用于存储键值对。它们的主要区别在于实现方式和标准支持。
unordered_map是C++11引入的标准库容器,使用哈希表实现。它提供了快速的查找、插入和删除操作,平均时间复杂度为O(1)。unordered_map中的元素是无序的,不会按照插入顺序或者键的大小进行排序。
hash_map是一种非标准的容器,它也使用哈希表实现。hash_map在C++11之前被一些编译器提供,但不是所有编译器都支持。C++11之后,推荐使用unordered_map代替hash_map。
总结一下:
unordered_map:
- 标准库容器,C++11引入
- 使用哈希表实现
- 提供快速的查找、插入和删除操作
- 元素无序
hash_map:
- 非标准容器
- 使用哈希表实现
- 不是所有编译器都支持
- C++11之后推荐使用unordered_map代替
unordered_map 自定义 hash
unordered_map是C++标准库中的一个关联容器,它使用哈希表来实现键值对的存储和查找。如果我们想要在unordered_map中使用自定义类型作为键,我们需要提供一个自定义的哈希函数来计算键的哈希值。
下面是一个示例,展示了如何在unordered_map中使用自定义哈希函数:
```cpp
#include <iostream>
#include <unordered_map>
#include <string>
struct Person {
std::string name;
int age;
Person(const std::string& n, int a) : name(n), age(a) {}
};
struct PersonHasher {
std::size_t operator()(const Person& p) const {
std::size_t res = 17;
res = res * 31 + std::hash<std::string>()(p.name);
res = res * 31 + std::hash<int>()(p.age);
return res;
}
};
int main() {
std::unordered_map<Person, int, PersonHasher> myMap;
Person p1("Alice", 25);
Person p2("Bob", 30);
myMap[p1] = 100;
myMap[p2] = 200;
std::cout << "Value for p1: " << myMap[p1] << std::endl; // 输出:100
std::cout << "Value for p2: " << myMap[p2] << std::endl; // 输出:200
return 0;
}
```
在上面的示例中,我们定义了一个名为Person的自定义类型,并提供了一个名为PersonHasher的自定义哈希函数。在unordered_map的声明中,我们使用了Person作为键类型,并指定了PersonHasher作为哈希函数。
在PersonHasher中,我们重载了operator()运算符,根据Person对象的name和age成员变量计算哈希值。我们使用std::hash来计算每个成员变量的哈希值,并将它们组合起来得到最终的哈希值。
通过这种方式,我们可以在unordered_map中使用自定义类型作为键,并使用自定义的哈希函数来计算键的哈希值。