在C++中,unordered_set
和 unordered_map
都是基于哈希表实现的无序关联容器,它们之间的主要区别在于存储的数据类型和使用的场景。具体区别如下:
1. 键值对 vs. 单一值
-
unordered_set
:只存储唯一的键,不存储对应的值。它类似于数学中的集合,每个元素都唯一。例如:std::unordered_set<int> mySet; mySet.insert(1); mySet.insert(2);
在这种情况下,
mySet
只存储整数键。 -
unordered_map
:存储键-值对,即每个键都有一个与之对应的值。键必须唯一,但值可以重复。例如:std::unordered_map<int, std::string> myMap; myMap[1] = "one"; myMap[2] = "two";
在这种情况下,
myMap
存储整数键和字符串值的映射。
2. 访问方式
-
unordered_set
:只能通过键来访问元素,无法根据值访问。例如,可以检查某个元素是否在集合中,但无法根据值检索,因为它没有值部分。if (mySet.find(1) != mySet.end()) {// 元素 1 存在 }
-
unordered_map
:可以根据键来访问对应的值。例如:std::string value = myMap[1]; // 获取键 1 对应的值 "one"
3. 用途
unordered_set
:适用于只关心元素是否存在的场景,不需要存储任何附加数据。unordered_map
:适用于需要通过键来查找值的场景,常用于键值对的映射存储,如字典。
4. 底层实现
- 相同点:两者底层都是通过哈希表实现,插入、查找、删除的平均时间复杂度都是 (O(1))。
- 不同点:
unordered_set
中每个桶只存储键,而unordered_map
中每个桶存储的是键和值的组合。
总结:
unordered_set
:适用于不需要值,只关心唯一键的场景。unordered_map
:适用于需要存储键值对,通过键快速查找对应值的场景。
希望这些区别对你有帮助!