以下课程的正确operator<
是什么?
struct Person {
int height;
int width;
friend bool operator<(const Person&, const Person&);
};
谢谢!
答案 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或哈希表。但无论如何,你需要照顾运营商==。