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

时间:2010-04-26 02:11:26

标签: c++ operator-overloading

以下课程的正确operator<是什么?

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

谢谢!

4 个答案:

答案 0 :(得分:7)

这完全取决于你以及你希望人们如何自然地排序。如果你想要先矮人,但如果他们的身高相同,那么他们就会瘦下来:

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;
}

答案 1 :(得分:1)

我的样板方式:

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

但是如果可以,请考虑使用pair<int, int>的typedef。

这有点无意义地使用所有可用数据来排序。 (这里的东西首先按宽度排序,然后按宽度排序,如果宽度相等。)如果你只是使用排序来找到相同的元素,那可能就是你想要的。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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

但是永远不要使用区域来命令它们,否则你需要根据区域定义相等,然后(4,5)==(5,4)来获得完整的订单。我想你不想那样。注意,如果!((4,5)&lt;(5,4))和(4,5)!=(5,4),我们可以推导出(5,4)&lt; 5,4。 (4,5),这也是假的。

如果您没有使用集合的有序特性,您可以考虑使用unordered_set或哈希表。但无论如何,你需要照顾运营商==。