C++ Kurs

Wenn fertig, bitte Fenster schließen

Lösung zur Lektion "Standard Container"


// Lösung zu Standard Container

// Zum aufsteigenden Sortieren nach Abflugzeiten ARR_TIME_SORT defineren
// Ansonsten wird fallend nach der Flugnummer sortiert
#define ARR_TIME_SORT

// Dateien einbinden
#include <iostream>
#include <iomanip>
#include <string>
#include <queue>

using std::cout;
using std::endl;
using std::string;
using std::priority_queue;

// Klasse für Flugdaten
class Flight
{
    string number;                 // Flugnummer
    unsigned char arrivalHour;     // Ankunftszeit Stunde
    unsigned char arrivalMinute;   // Ankunftszeit Minute
#ifdef ARR_TIME_SORT
    friend struct Ascend;           // functor zum Sortieren
#endif
  public:
    // Standard-ctor, wird von priority_queue benötigt
    Flight()
    {}
    // ctor, erhält Flugnummer und Ankunftszeit
    Flight(const string& num, unsigned char hour, unsigned char minute): number(num)
    {
        arrivalHour = hour;
        arrivalMinute = minute;
    }
    // Zuweisungsoperator
    Flight& operator = (const Flight& rhs)
    {
        number = rhs.number;
        arrivalHour = rhs.arrivalHour;
        arrivalMinute = rhs.arrivalMinute;
        return *this;
    }
    // Vergleichsoperatoren für priority_queue
    friend bool operator < (const Flight& lhs, const Flight& rhs);
    friend bool operator == (const Flight& lhs, const Flight& rhs);
    // Überladener Ausgabestream Operator
    friend std::ostream& operator << (std::ostream& os, const Flight& rhs);
};
// friend-Funktionen fur Vergleiche
bool operator < (const Flight& lhs, const Flight& rhs)
{
    return lhs.number < rhs.number;
}
bool operator == (const Flight& lhs, const Flight& rhs)
{
    return rhs.arrivalHour == lhs.arrivalHour &&
           rhs.arrivalMinute == lhs.arrivalMinute;
}

// Überladener Operator für Ausgabestream
inline std::ostream& operator << (std::ostream& os, const Flight& rhs)
{
    os << std::setfill('0');
    os << "Flug: " << rhs.number << ", Ankunft: "
        << std::setw(2) << static_cast<int>(rhs.arrivalHour) << ':'
       << std::setw(2) << static_cast<int>(rhs.arrivalMinute) << endl;
    os << std::setfill(' ');
    return os;
}

#ifdef ARR_TIME_SORT
// Frei definiertes Sortierkriterium zum aufsteigenden Sortieren
// nach Ankunftszeiten
struct Ascend
{
    bool operator() (const Flight& lhs, const Flight& rhs) const
    {
        if (lhs.arrivalHour > rhs.arrivalHour)
            return true;
        if (lhs.arrivalHour == rhs.arrivalHour)
            return lhs.arrivalMinute > rhs.arrivalMinute;
        return false;
    }
};
#endif

// main() Funktion
int main()
{
    // Prioritätsqueue definieren
#ifdef ARR_TIME_SORT
    Ascend CmpArrivals;
    priority_queue<Flight,std::vector<Flight>,Ascend> Arrivals(CmpArrivals);
#else
    priority_queue<Flight> Arrivals;
#endif

    // Flüge in Queue ablegen
    Arrivals.push(Flight("333",17,38));
    Arrivals.push(Flight("111",10,59));
    Arrivals.push(Flight("444",10,38));
    Arrivals.push(Flight("222",9,0));

    // Alle Flüge nun ausgeben und nach der Ausgabe
    // auch wieder entfernen
    while (!Arrivals.empty())
    {
        cout << Arrivals.top();
        Arrivals.pop();
    }
}