2

我正在开发一个用 C++ 管理酒店的程序。我有一个房间列表。所有这些房间都有楼层号、房间号和价格。在我的一个报告/显示功能中,我必须按照楼层号的顺序打印房间,然后是房间号。我的意思是每层楼会有多个房间,所以如果你对 1 楼的所有房间进行排序,它会在进入下一层之前按升序对房间进行排序。

现在,我了解了如何按楼层号对房间进行排序,并且我知道如何按房间号进行排序。我不明白的是我如何将它组合起来,这样一个人就不会重写另一个人的顺序。

提前致谢。

4

3 回答 3

3

为了对Rooms 的容器进行排序,您需要调用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);  
}
于 2012-07-14T20:59:17.967 回答
3

好吧,必须定义的只是小于运算符。

基本上,如果 Room1.floor < Room2.floor 那么 Room1 必须比 Room2 先出现。如果 Room1.floor==Room2.floor 并且 Room1.number < 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 标志(在 g++ 4.5 和 4.6 上),或者 -std=c++11 如果使用 g++ 4.7

于 2012-07-14T21:00:56.760 回答
0

每个排序算法最终都必须比较两个项目以确定哪个应该先出现。此时,您应该将两个值作为一组进行比较。

让我们想想应该发生什么:

  • 如果楼层数越大,则越大。
  • 如果楼层数越小,则越小。
  • 如果楼层相同,则比较房间号来决定。
于 2012-07-14T20:59:23.377 回答