STL无序关联容器—unorded_set+unorded_map

两个无序关联容器将底层的红黑树变成了哈希表。

一、核心定位(一句话)

  • unordered_set = 无序、更快、不排序set
  • unordered_map = 无序、更快、不排序map

它们底层是哈希表,所以:

  • 平均插入 / 查找 / 删除 O (1)(比 set/map 快很多)
  • 不保证顺序,遍历出来是乱的
  • 用法几乎和 set/map 完全一样

二、unordered_set 详细说明(基于 set)

1. 和 set 相同的地方(你已经会了)

  • 元素唯一,不能重复
  • insert() erase() find() count()
  • 迭代器遍历
  • 元素不能修改(必须删了重插)

2. 和 set 不同的地方(必须记住)

  1. 无序 插入 {3,1,2}set 输出:1 2 3unordered_set 输出:乱序(可能 2 1 3 或其他)

  2. 速度更快 set:O(log n)unordered_set:平均 O (1)

  3. 不支持 lower_bound /upper_bound因为没有顺序,无法范围查找。

  4. 头文件不同

    cpp 复制代码
    #include <unordered_set>

3. 常用代码(和 set 一模一样)

cpp 复制代码
unordered_set<int> us;

us.insert(5);    // 插入
us.erase(5);     // 删除
auto it = us.find(5); // 查找

if(it != us.end())
    cout << *it << endl;

4. 特别注意

  • 遍历顺序不固定
  • 千万不要依赖顺序
  • 性能比 set 好很多

三、unordered_map 详细说明(基于 map)

1. 和 map 相同的地方

  • 键唯一
  • 支持 []at()insert()erase()find()
  • 可以修改值 ,不能修改键
  • 用法几乎一样

2. 和 map 不同的地方

  1. 无序 map 按键排序unordered_map 不排序

  2. 速度更快 map:O(log n)unordered_map:平均 O (1)

  3. 不支持 lower_bound /upper_bound

  4. 头文件不同

    cpp 复制代码
    #include <unordered_map>

3. 代码示例(和 map 一样)

cpp 复制代码
unordered_map<int, string> um;

um[1] = "one";    // 插入/修改
um.insert({2, "two"});

auto it = um.find(1);
if(it != um.end())
    cout << it->second << endl;

四、最关键的 4 个区别(必背)

1. 顺序

  • set / map:有序
  • unordered:无序

2. 速度

  • set / map:O(log n)
  • unordered:平均 O (1) 更快

3. 底层结构

  • set /map:红黑树
  • unordered:哈希表

4. 范围查找

  • set /map:支持 lower_bound
  • unordered:不支持
相关推荐
傻啦嘿哟5 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670795 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄6 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
码匠许师傅6 小时前
【设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)
c++·设计模式·uml
Seoyoneh6 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
啦啦啦啦啦zzzz7 小时前
Logger的组装(c++20)
c++·算法·c++20
Tangyuewei7 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界7 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
繁星蓝雨8 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J8 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪