# C++ 运算符重载:从基础结构体到哈希表优化
在 C++ 的世界里,运算符重载(Operator Overloading) 是赋予自定义类型 “一等公民” 身份的关键。它不仅能让代码更符合直觉,更是进阶容器(如 std::unordered_map )和算法库的敲门砖。
# ## 1. 为什么我们需要重载?
假设你定义了一个坐标结构体 Point 。如果没有重载,你可能需要写成 add(p1, p2) ;有了重载,你只需写 p1 + p2 。
核心原则: 不要改变运算符的原有语义(比如不要把
+重载成减法),保持符合直觉的逻辑。
# ## 2. 基础篇:结构体与比较运算符
在算法竞赛或工程开发中,结构体的排序是最常见的需求。为了让 std::sort 或 std::set 能够工作,需要重载 < 。
# 示例:点坐标的排序
1 | struct Point { |
# ## 3. 进阶篇:算术与复合运算符
为了实现完整的数学逻辑,通常建议同时重载运算符及其复合形式(如 + 和 += )。
# 最佳实践:
- 成员函数实现
+=。 - 全局函数(或友元函数)实现
+,并通过调用+=来复用逻辑。
1 | struct Vector2D { |
# ## 4. 核心篇:在哈希表中使用自定义类型
如果想将自定义结构体作为 std::unordered_map 或 std::unordered_set 的 Key,仅仅重载 < 是不够的。需要提供两样东西:
- 等值比较运算符 (
operator==)。 - 哈希函数 (Hash Function)。
# 完整实现代码
1 |
|
# ## 5. 易错点总结
const 的正确使用:作为容器 Key 的比较函数必须是
const的。返回值类型:
比较运算符返回
bool。算术运算符(+,-)返回新对象(传值)。
赋值与复合运算符(=,+=)返回当前引用 (
*this)。效率考量:对于大型结构体,始终通过
const Reference传递参数。
# ## 结语
运算符重载是 C++ 语法糖中最甜的一颗,但过度使用也会导致代码晦涩难懂。在实现哈希表适配时,务必保证 operator== 和 hash 函数的逻辑一致性 —— 即如果 a == b ,那么 hash(a) 必须等于 hash(b) 。