我正在开发一个用C ++管理酒店的程序。我有一份房间清单。所有这些房间都有楼层号码,房间号码和价格。 在我的一个报告/显示功能中,我必须按楼层号码的顺序打印出房间,首先是房间号码。我的意思是每层楼都会有多个房间,所以如果你对1楼的所有房间进行分类,它会在房间进入下一层之前按升序对房间进行分类。
现在,我了解如何按楼层号对房间进行排序,我知道如何按房间号排序。我不明白的是我如何将它结合起来,以便一个人不会过度写另一个的顺序。
提前致谢。
答案 0 :(得分:3)
要对Room
s的容器进行排序,您需要在其上调用std::sort
。它有一个带有比较器的重载,即一个确定哪个Room
是“更少”的函数对象。如果您想先按楼层排序,再按房间号排序,则必须编写适当的功能对象(或简单的功能)。
bool CompareByFloorAndRoomNo(const Room& r1, const Room& r2)
{
if(r1.FloorNo() != r2.FloorNo())
return r1.FloorNo() < r2.FloorNo();
return r1.RoomNo() < r2.RoomNo();
}
...
int main()
{
...
std::sort(rooms.begin(), rooms.end(), CompareByFloorAndRoomNo);
}
答案 1 :(得分:3)
那么,必须定义的只是小于运算符。
基本上如果Room1.floor&lt; Room2.floor然后Room1必须比Room2先到。如果Room1.floor == Room2.floor和Room1.number&lt; Room2.number,Room1仍然需要在Room2之前来。否则Room2必须先到。
代码:
sort(rooms.begin(),rooms.end(),[](const Room& first,const Room& second)
{
return first.floor<second.floor ||
(first.floor == second.floor && first.number<second.number );
}
);
修改强>
此代码与C ++ 11兼容。要编译它你应该使用 -std = c ++ 0x flag(在g ++ 4.5和4.6上),或-std = c ++ 11如果使用g ++ 4.7
答案 2 :(得分:0)
每个排序算法最终必须比较两个项目以确定哪个应该是第一个。此时,您应该将两个值都比较为一组。
让我们考虑应该发生什么: