AI Academy
促销
CodeGym University
学习
课程
任务
调查 & 测验
游戏
帮助
日程
社区
Users
论坛
聊天
文章
成功故事
动态
评价
订阅
浅色主题
课时
评论
关于我们
开始
开始学习
立即开始学习
我的进度
课程
任务地图
课程
C++
C++
级别 25
哈希表 vs 树
C++ SELF
等级 25,
课时 0
解析 C++ 的关联容器:有序的
std::map
(基于树,复杂度为
O(log N)
)与
std::unordered_map
(哈希表,平均为
O(1)
)有何区别,什么时候键的顺序很重要,如何通过
find
/
contains
安全读取,为什么
operator
[]
可能会“悄悄”创建元素,以及在实践中常见的错误有哪些(以小型项目 TaskBook 的 id →
Task
索引为例)。
set / unordered_set
C++ SELF
等级 25,
课时 1
解析 C++ 中的集合容器:
std::set<T>
(对元素进行排序)与
std::unordered_set<T>
(哈希表)有什么区别,如何使用基本操作
insert
,
contains
/
find
,
erase
,如何快速从
std::vector
去重,以及为什么
set
中的元素不能“就地”修改。最后 — 一个实践小案例(TaskBox 中的标签)和典型错误。
键的契约:map 的 operator<,unordered_map 的 hash + ==
C++ SELF
等级 25,
课时 2
解析 C++ 关联容器的“键契约”:为什么
std::map
/
std::set
属于严格顺序的世界(比较器和
operator<
),而
std::unordered_map
/
std::unordered_set
属于哈希与相等的世界(
std::hash
+
==
)。我们将看到容器如何决定“键是否相同”,为什么比较器不能用
<=
实现,以及如果改变相等但忘记同步哈希会发生什么。
自定义键:struct Key、operator== 与 std::hash<Key>
C++ SELF
等级 25,
课时 3
解析如何为
std::unordered_map
制作复合键:设计按需字段的
struct
键,编写正确的
operator==
,遵守
std::hash
的约定(如果
a == b
,则哈希必须相等),混合各字段的哈希,并通过容器的第三个模板参数传入哈希器,或通过专门化
std::hash<Key>
来接入哈希。
数据索引:id → 对象,标签 → 列表
C++ SELF
等级 25,
课时 4
讲解如何通过索引加速典型的数据查询:主索引
id
→
对象,基于
std::unordered_map
;以及二级索引
tag
→
id 集合,基于
std::unordered_map
+
std::unordered_set
。展示“一处真实来源”的原则、统一的添加/删除/更新操作、按
id
和标签的查询,以及帮助发现不同步问题的简单不变量校验。
Please enable JavaScript to continue using this application.