Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przeciążanie operatorów

Ostatnio zmodyfikowano 2017-05-22 20:51
Autor Wiadomość
Czachodym
Temat założony przez niniejszego użytkownika
Przeciążanie operatorów
» 2017-05-22 02:56:15
Witam. Piszę program na studia, którego pewna część polega na tym, że do kolejki priorytetowej wrzucam kilka obiektów struktury Edge. Program ma posortować krawędzie grafu. Wygląda to w ten sposób:

C/C++
struct Edge {
    int vertexStart, vertexEnd, weight;
   
    bool Edge::operator ()( const Edge & edge1, const Edge & edge2 ) {
        if( edge1.weight > edge2.weight ) return true;
       
        if( edge1.weight < edge2.weight ) return false;
       
        return false;
    }
};

Po odpaleniu programu i wyświetleniu krawędzi dostaję:


0 4 1
4 0 1
2 1 2
0 5 2
4 1 2
1 4 2
1 2 2
5 0 2
4 3 3
3 4 3
0 1 4
1 0 4
5 3 6
3 5 6
4 5 7
5 4 7
2 3 8
3 2 8

Gdzie cyfry oznaczają kolejno: wierzchołek z którego krawędź wychodzi, na którym się kończy i wagę tej krawędzi.
Jak widać krawędzie sortują się według wag. Tutaj jest mój problem. Jak to przeciążyć tak, by wyświetlane krawędzie były posortowane po wagach, a krawędzie o tych samych wagach były także posortowane według numeru wierzchołka na którym się kończą? Wszelkie moje próby kończą się kompletnie losowym sortowaniem elementów w kolejce, proszę o pomoc.
P-161404
mateczek
» 2017-05-22 10:07:44
dlaczego przeciążasz operator ()?? a nie znak mniejszości ??
dlaczgo operator będący składnikiem klasy jest dwuargumentowy??
C/C++
struct Edge {
    int vertexStart, vertexEnd, weight;
    bool Edge::operator <( const Edge & edge ) {
        return( weight < edge.weight );
    }
};
P-161407
karambaHZP
» 2017-05-22 11:10:40
C/C++
bool Edge::operator <( const Edge & edge ) const
{
    return std::tie( weight, vertexEnd ) < std::tie( edge.weight, edge.vertexEnd );
}
P-161411
Czachodym
Temat założony przez niniejszego użytkownika
» 2017-05-22 20:51:26
Przy przeciążaniu operatora < wyrzuca błąd: funkcja przyjmująca 2 argumentów nie jest wynikiem przetworzenia termu. Ale używając Waszego kodu do przeciążenia operatora () i minimalnej edycji go wszystko zadziałało. Dziękuję za pomoc, zamykam.
P-161436
« 1 »
  Strona 1 z 1