C ++中的双重排序

时间:2012-07-14 20:52:44

标签: c++ sorting

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

现在,我了解如何按楼层号对房间进行排序,我知道如何按房间号排序。我不明白的是我如何将它结合起来,以便一个人不会过度写另一个的顺序。

提前致谢。

3 个答案:

答案 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)

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

让我们考虑应该发生什么:

  • 如果楼层数越大,它就越大。
  • 如果楼层数较小,则会更小。
  • 如果楼层号相同,请比较房间号以进行决定。