代码之家  ›  专栏  ›  技术社区  ›  Frank

对于具有两个int成员的简单类,正确的less运算符是什么?

  •  -1
  • Frank  · 技术社区  · 14 年前

    正确的是什么 operator< 下节课?

    struct Person {
      int height;
      int width;
      friend bool operator<(const Person&, const Person&);
    };
    

    谢谢!

    4 回复  |  直到 14 年前
        1
  •  7
  •   Marcelo Cantos    14 年前

    这完全取决于你和你希望人们如何自然分类。如果你想让个子矮的人先来,但如果他们的身高相同,那么瘦子比高的人先来:

    friend bool operator<(const Person& a, const Person& b) {
        return a.height != b.height ? a.height < b.height : a.width < b.width;
    }
    

    如果您想测量一个人的表面积来确定排序:

    friend bool operator<(const Person& a, const Person& b) {
        return a.height * a.width < b.height * b.width;
    }
    
        2
  •  1
  •   Jasmeet    14 年前

    取决于您想要排列/排序人员实例的方式。一个例子是

     bool operator<(const Person& one, const Person& two) {
         return one.height < two.height ||(one.height == two.height && one.width <two.width);
     }
    

    即先看高度(先按最短的排列),如果高度相同,先看宽度,再按较窄的排列。

        3
  •  1
  •   Potatoswatter R. Martinho Fernandes    14 年前

    我的样板操作方法:

    friend bool operator<(const Foo& l, const Foo& r) {
        return l.width < r.width? true
             : r.width < l.width? false
             : l.height < r.height;
    }
    

    但考虑使用typedef pair<int, int> 相反,如果可以的话。

    这有点无意义地使用所有可用的数据对事物进行排序。(如果宽度相等,则先按宽度排序,然后按高度排序。)如果只使用顺序查找相同的元素,则这可能是您想要的。

        4
  •  1
  •   Vicente Botet Escriba    14 年前

    为了将类放入集合中,还需要注意operator==。有了类中的数据,我认为您不能定义一个好的运算符==。或者你的意思是两个宽度和高度相同的人是一样的?我将添加一些唯一的标识符,以便为人员定义完整的订单。

    如果你没有更多的信息,你可以使用字典顺序上指出的另一个答案。

    但不要使用区域对其排序,否则需要根据区域定义相等,然后(4,5)==(5,4)才能获得完整的顺序。我想你不想那样。注意如果!(4,5)<(5,4))和(4,5)!=(5,4),我们可以推断(5,4)<(4,5),这也是错误的。

    如果不使用集合的有序性质,可以考虑使用无序集合或哈希表。但在任何情况下,您都需要处理operator==。