为什么我们需要 C++ 中的 spaceship <=> 运算符?
Why do we need the spaceship <=> operator in C++?
为什么我们在 C++ 中需要这样的运算符,它在现代 C++ 编程中有何用处?任何可以应用此方法的真实代码示例都会有所帮助。
这个问题旨在了解现实世界中的实际应用,而无需阅读 Herb Sutter 的冗长提案。虽然没有冒犯这个提议。
我给你三点动力,就在我的脑海里:
- 这是所有其他比较运算符的通用概括(对于 totally-ordered 域):
>
、>=
、==
、<=
、<
。使用 <=>
(宇宙飞船),您可以以完全通用的方式实现这些其他操作中的每一个。
- 对于字符串,它等同于 C 标准库中的旧
strcmp()
函数。所以 - 对于字典顺序检查很有用,例如向量或列表或其他有序容器中的数据。
- 对于整数,这就是硬件所做的:在
x86
或 x86_64
上比较 a 和 b (CMP RAX, RBX
) 基本上就像减法 (SUB RAX, RBX
)除了 RAX
实际上没有改变,只有标志受到影响,所以你可以使用 "jump on equal/not equal/greater than/lesser than/etc." (JE/JNE/JGT/JLT 等)作为下一条指令。 CMP
应该被认为是 "spaceship compare".
为什么我们在 C++ 中需要这样的运算符,它在现代 C++ 编程中有何用处?任何可以应用此方法的真实代码示例都会有所帮助。
这个问题旨在了解现实世界中的实际应用,而无需阅读 Herb Sutter 的冗长提案。虽然没有冒犯这个提议。
我给你三点动力,就在我的脑海里:
- 这是所有其他比较运算符的通用概括(对于 totally-ordered 域):
>
、>=
、==
、<=
、<
。使用<=>
(宇宙飞船),您可以以完全通用的方式实现这些其他操作中的每一个。 - 对于字符串,它等同于 C 标准库中的旧
strcmp()
函数。所以 - 对于字典顺序检查很有用,例如向量或列表或其他有序容器中的数据。 - 对于整数,这就是硬件所做的:在
x86
或x86_64
上比较 a 和 b (CMP RAX, RBX
) 基本上就像减法 (SUB RAX, RBX
)除了RAX
实际上没有改变,只有标志受到影响,所以你可以使用 "jump on equal/not equal/greater than/lesser than/etc." (JE/JNE/JGT/JLT 等)作为下一条指令。CMP
应该被认为是 "spaceship compare".