2

C++ でホテルを管理するプログラムに取り組んでいます。部屋のリストがあります。これらのすべての部屋には、フロア番号、部屋番号、および価格があります。私のレポート/表示機能の 1 つで、最初にフロア番号の順序で部屋を印刷し、次に部屋番号で印刷する必要があります。つまり、各フロアに複数の部屋があるため、1 階のすべての部屋を並べ替えると、次の階に移動する前に部屋が昇順で並べ替えられます。

これで、フロア番号で部屋を並べ替える方法と、部屋番号で並べ替える方法がわかりました。私が理解していないのは、一方が他方の順序を上書きしないように組み合わせる方法です。

前もって感謝します。

4

3 に答える 3

3

のコンテナをソートするには、それRoomを呼び出す必要があります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の場合)を使用するか、g++4.7を使用している場合は-std=c++11を使用する必要があります。

于 2012-07-14T21:00:56.760 に答える
0

すべての並べ替えアルゴリズムは、最終的に2つの項目を比較して、どちらが最初に来るかを決定する必要があります。この時点で、両方の値を1つのセットとして比較する必要があります。

何が起こるべきか考えてみましょう:

  • フロア数が多いほど大きくなります。
  • フロア数が少ないほど小さくなります。
  • フロア番号が同じ場合は、部屋番号を比較して決定してください。
于 2012-07-14T20:59:23.377 に答える