当前位置:   article > 正文

C++20尝鲜:<=>三路比较运算符(Three-way comparison)_c++20 <=>

c++20 <=>

三路比较运算符 <=> 也被称为宇宙飞船运算符(spaceship operator)。

三路比较运算符表达式的形式为:

左操作数<=>右操作数

为什么引入

如果项目中使用struct的值用作std::map的key,因此就需要自己实现比较运算符。如果实现得不对(可能会出现自相矛盾,a < b 且 b < a),程序可能会崩溃。

  1. struct Name {
  2. string first_name;
  3. string mid_name;
  4. string last_name;
  5. };
  6. //C++11
  7. bool operator<(const Name& other) const {
  8. return first_name<other.first_name
  9. || first_name == other.first_name && mid_name < other.mid_name
  10. || first_name == other.first_name && mid_name == other.mid_name && last_name < other.last_name;
  11. }
  12. //C++11
  13. bool operator<(const Name& other) const {
  14. return std::tie(first_name, mid_name, last_name) <
  15. std::tie(other.first_name, other.mid_name, other.last_name);
  16. }
  17. //C++20
  18. struct Name {
  19. string first_name;
  20. string mid_name;
  21. string last_name;
  22. //编译器默认实现,注入语义,强序
  23. std::strong_ordering operator<=>(const Name&) const = default;
  24. };

在C++17, 需要 18 比较函数:

  1. class CIString {
  2. string s;
  3. public:
  4. friend bool operator==(const CIString& a, const CIString& b) {
  5. return a.s.size() == b.s.size() &&
  6. ci_compare(a.s.c_str(), b.s.c_str()) == 0;
  7. }
  8. friend bool operator< (const CIString& a, const CIString& b) {
  9. return ci_compare(a.s.c_str(), b.s.c_str()) < 0;
  10. }
  11. friend bool operator!=(const CIString& a, const CIString& b) {
  12. return !(a == b);
  13. }
  14. friend bool operator> (const CIString& a, const CIString& b) {
  15. return b < a;
  16. }
  17. friend bool operator>=(const CI
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/672224
推荐阅读
相关标签
  

闽ICP备14008679号