这个unordered_map为什么可以有这么多value值呢std::unordered_map<Key, Value, Hash, KeyEqual>
时间: 2023-08-31 16:13:55 浏览: 112
`std::unordered_map` 是 C++ 标准库中的一个容器,它实现了哈希表的数据结构。哈希表是一种高效的数据结构,它允许我们存储和访问键值对。在 `std::unordered_map` 中,键是唯一的,并且通过哈希函数将键映射到一个位置来存储值。
`std::unordered_map` 模板接受四个参数:`Key` 是键的类型,`Value` 是值的类型,`Hash` 是用于计算键的哈希值的哈希函数对象,`KeyEqual` 是用于比较键的相等性的函数对象。
因为哈希表的设计,它可以存储大量的键值对,而且在插入、查找和删除操作时具有快速的性能。所以在 `std::unordered_map` 中可以有很多个值,只要键是唯一的,每个键对应一个值。
相关问题
typedef std::unordered_map<std::string, std::string> HeadersMap;
`typedef` 是C++中的一个关键字,用于为现有的类型创建一个新的别名。在这个例子中,`typedef` 被用于创建 `std::unordered_map<std::string, std::string>` 类型的新名称 `HeadersMap`。
`std::unordered_map` 是C++标准库中的一个容器,属于关联容器的一种。它存储的元素是键值对(key-value pairs),其中每个键都唯一地映射到一个值。这个容器内部使用哈希表(hash table)实现,因此它不保持任何特定的顺序。当你需要一个快速查找的数据结构时,`unordered_map` 是一个很好的选择。
这里给出的 `unordered_map` 特定化为使用 `std::string` 作为键和值的类型。这意味着,每一个键和每一个值都是字符串类型,这在处理如HTTP头部或任何需要键和值都是字符串的映射时非常有用。
`HeadersMap` 就是这样一个特定的 `unordered_map` 类型的别名,它使得代码更加清晰和易于理解,特别是当你在代码中多次引用这种特定类型的 `unordered_map` 时。
比较 std::map< Ty1,Ty2>,std::unordered_map< Ty1, Ty2>和 vector<pair< _Ty1,_Ty2>>。尝试把自己的定义的类class MyClass 用于map 和unordered map 的第一个模板参数 Ty1,还需要进行什么定义?
std::map和std::unordered_map都是关联容器,都可以用于存储键值对,但它们的实现方式不同。std::map是基于红黑树实现的,所以它的元素是有序的;而std::unordered_map是基于哈希表实现的,所以它的元素是无序的。vector<pair<_Ty1, _Ty2>>则是一个顺序容器,可以用于存储键值对,但是它的查找和插入效率要比map和unordered_map低得多。
如果要将自定义的类MyClass用于map和unordered_map的第一个模板参数Ty1,需要满足以下要求:
1. MyClass需要定义小于运算符(operator<),以便map可以对元素进行排序;
2. MyClass需要提供哈希函数(hash函数),以便unordered_map可以将元素映射到桶中。
例如,假设我们定义了如下的MyClass类:
```c++
class MyClass {
public:
int key;
std::string value;
bool operator<(const MyClass& other) const {
return key < other.key;
}
};
struct MyClassHash {
size_t operator()(const MyClass& obj) const {
return std::hash<int>()(obj.key);
}
};
```
则可以将MyClass用于map和unordered_map的第一个模板参数Ty1,如下所示:
```c++
std::map<MyClass, int> myMap;
std::unordered_map<MyClass, int, MyClassHash> myUnorderedMap;
```
需要注意的是,如果MyClass的成员变量发生变化,可能会导致它们在map和unordered_map中的顺序发生变化,因此需要谨慎使用。
阅读全文