leecode unordered_map与unordered_set常见接口函数

std::unordered_setstd::unordered_map核心设计思想相似(均基于哈希表实现,提供 O(1) 平均时间复杂度的查找),但它们的 API 并不完全相同,主要区别源于二者用途不同:
unordered_map 存储键值对(key-value),需通过键访问值。
unordered_set 仅存储键(key),用于快速判断元素是否存在。


1. 相同点

以下 API 在两者中功能一致:

操作功能说明示例(unordered_map / unordered_set
insert()插入元素map.insert({key, value}) / set.insert(key)
emplace()直接构造元素(避免拷贝)map.emplace(key, value) / set.emplace(key)
erase()删除指定元素map.erase(key) / set.erase(key)
find()查找元素,返回迭代器auto it = map.find(key) / auto it = set.find(key)
count()返回元素是否存在(0 或 1)if (map.count(key)) / if (set.count(key))
size()返回元素数量map.size() / set.size()
empty()判断容器是否为空map.empty() / set.empty()
clear()清空所有元素map.clear() / set.clear()
begin(), end()返回迭代器用于遍历容器

2. 不同点

(1)元素访问

unordered_map 提供 operator[]at() 直接访问值:

unordered_map<string, int> map = {{"Alice", 25}};
cout << map["Alice"];    // 输出 25(若 key 不存在会自动插入默认值!)
cout << map.at("Alice"); // 输出 25(若 key 不存在抛出异常)

unordered_set 没有这些接口,因为它不存储值。

(2)迭代器解引用

unordered_map 的迭代器指向 pair<const Key, T>,需用 it->firstit->second 访问键和值:

for (auto it = map.begin(); it != map.end(); ++it) {
    cout << it->first << ": " << it->second; // 输出键值对
}

unordered_set 的迭代器直接指向 Key

unordered_set<int> set = {1, 2, 3};
for (auto it = set.begin(); it != set.end(); ++it) {
    cout << *it; // 输出元素值
}
(3)初始化与插入

unordered_map 插入键值对需用 {key, value}

map.insert({"Bob", 30});

unordered_set 只需插入键:

set.insert(42);

3. 何时选择?

unordered_map
需要建立 键到值的映射(如统计词频、缓存键值对)。

unordered_map<string, int> word_count;
word_count["hello"]++; // 统计单词出现次数

unordered_set
只需 快速判断元素是否存在(如去重、检查重复)。

unordered_set<int> seen;
if (seen.count(num)) return true; // 检查重复数字

4. 性能注意事项

两者均为哈希实现,但 unordered_map 存储更多数据(需存值),内存占用略高。
均需注意哈希冲突,复杂键类型需自定义哈希函数(如对自定义类或 pair 哈希)。


总结

相同点:插入、删除、查找等基础操作接口一致。
不同点
unordered_map 提供键值对访问([]at),迭代器解引用为 pair
unordered_set 仅存储键,更轻量级。

根据场景选择:需要关联值时用 map,只需存在性检查时用 set

`unordered_map` 和 `unordered_set` 都属于 C++ 标准库中的关联容器,它们基于哈希表实现,因此提供平均常数时间复杂度的查找、插入和删除操作。 ### **unordered_map** - 它是一个键值对存储结构,类似于字典或映射。 - 每个元素由一个键(key)和一个对应的值(value)组成。 - 键是唯一的,不能有重复的键。 - 常见操作包括: - 插入:通过 `insert()` 或直接赋值的方式添加新的键值对。 - 查找:使用下标运算符 (`[]`) 或者 `find()` 函数定位特定键的位置。 - 删除:通过 `erase()` 移除指定的键及其对应值。 **示例代码片段:** ```cpp #include <iostream> #include <unordered_map> int main() { std::unordered_map<std::string, int> map; map["one"] = 1; // 插入键值对 if (map.find("one") != map.end()) { // 判断是否存在并访问 std::cout << "Key 'one': " << map["one"] << '\n'; } } ``` --- ### **unordered_set** - 只存储唯一的关键字集合。 - 关键字本身即为其数据内容,并且不允许存在重复项。 - 主要用作快速检测某个值是否存在于集合内的情况。 **常见操作包括:** - 添加新成员到集合里去——可以用`emplace`, `insert`. - 测试某成员是否已经存在——可以采用`count`, `find`. **示例代码片段:** ```cpp #include <iostream> #include <unordered_set> int main(){ std::unordered_set<int> mySet{42,7,-5}; for(auto const& elem : mySet){ std::cout << elem << "\t"; // 输出所有元素 } bool exists=mySet.count(-5); //检查是否有-5这个数值 std::cout<<"\nExists? "<<exists;//打印结果 } ``` --- 两者都利用了内部散列机制来保证高效性能。然而,在实际应用当中需要特别留意冲突处理以及负载因子等因素可能带来的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值