一、先分清这两个容器
unordered_map 和 unordered_set 都是 C++ 标准库里的哈希容器,底层都依赖哈希表。
unordered_map存的是键值对,key 唯一,value 负责挂在这个 key 上。unordered_set只存 key,而且 key 不能重复。
它们看起来像'无序',更准确地说,是不保证按插入顺序或键值顺序遍历。如果你想要稳定有序的遍历结果,这两个容器就不是合适的选择。
#include <iostream>
#include <unordered_map>
#include <unordered_set>
int main() {
std::unordered_map<int, std::string> map;
map[1] = "One";
map[2] = "Two";
std::unordered_set<int> set;
set.insert(1);
set.insert(2);
std::cout << "Map:" << std::endl;
for (const auto& pair : map) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
std::cout << "Set:" << std::endl;
for (const auto& item : set) {
std::cout << item << std::endl;
}
return 0;
}
二、哈希表到底怎么放数据
标准库实现细节不完全一样,但整体思路差不多:先算哈希值,再把元素放进对应的桶(bucket)。桶数量会随着元素增长而调整,避免某几个桶被塞得太满。
我更愿意把它理解成两层结构:外层是桶数组,内层是每个桶里挂着的元素链。
桶的角色
桶不是'数据本身',它更像一个入口。哈希函数先把 key 映射成一个下标,接着去对应桶里找元素。
一种常见的示意是这样:


