map (mit Klasse als Value) vergleichen



  • Moin,

    hab ne kurze Frage zu maps (oder im Prinzip allen STL-Containern).

    Wenn ich in einer map als Value eine Klasse oder ein struct speichere:

    map<int, myClass> Out;
    

    und dann diese map mit einer anderen vergleiche, wird dann der Vergleichsoperator der Klasse aufgerufen? Oder findet der Vergleich anders statt?



  • Du meinst so etwas:

    map<int,myClass> m1,m2;
    ...
    if(m1==m2)
      cout<<"identisch";
    

    Afaik werden da die Elemente mit operator== verglichen (bei den Schlüsselanteilen in map's und set's könnte auch die übergebene Vergleichsfunktion verwendet werden).

    Aber warum schaust du nicht selber nach? Die Vergleichsfunktionen findest du in den Systemheadern (<map> etc).



  • Es wird der Vergleichsoperator der Klasse benutzt.

    Wenn du zwei Container vergleichst, wird der Algorithmus equal über das Iteratoren-Intervall [begin(), end) aufgerufen, d.h. bei einer Map werden jeweils die Paare aus Key und Value miteinander über den == Operator verglichen. Bei pair greift dieser wieder auf die == Operatoren der beteiligten Typen zurück.



  • Mmh, dass dachte ich mir.

    Jetzt hab ich den Vergleichsoperator implementiert, jedoch kommt der Fehler 2678, dass der passende Operator nicht gefunden wurde:

    C:\Programme\Microsoft Visual Studio 8\VC\include\utility(63) : error C2678: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const IOPin' akzeptiert (oder keine geeignete Konvertierung möglich)

    Klasse IOPin

    ...
    
    // Vergleichsoperator
    bool IOPin::operator ==(const IOPin &p)
    {
        if(Mode != p.Mode)
            return false;
    
        if(Polarity != p.Polarity)
            return false;
    
        return true;
    }
    
    ...
    

    Verwendung in einer anderen Klasse IOPinConfig:

    ...
    
    map<unsigned long, IOPin> Input;
    map<unsigned long, IOPin> Output;
    
    /*
    	Vergleichsoperator
    */
    bool IOPinConfig::operator ==(const IOPinConfig &pc)
    {
    	if(!(Input == pc.Input))
    		return false;
    
    	if(!(Output == pc.Output))
    		return false;
    
    	return false;
    }
    
    ...
    

    Wenn ich den Vergleichsoperator von IOPinConfig aufrufe, soll er die beiden maps Input und Output vergleichen.
    Diese enthalten nen Schlüssel und eine Instanz der Klasse IOPin. Der Vergleichsoperator der map sollte doch jetzt den Vergleichsoperator von IOPin aufrufen. Laut Fehlermeldung versucht er das auch, aber warum findet er die Implementierung nicht?
    Oder ist sie schlicht falsch?



  • Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ '[b]const[/b] IOPin' akzeptiert
    

    ➡

    bool IOPinConfig::operator ==(const IOPinConfig &pc) const
    

    Müsste es sein.



  • Danke, dass war der Fehler.

    Kann mir das mal kurz jemand erklären?



  • Du übergibst bei Methodenaufrufen ja immer implizit ein Objekt IOPinConfig. Beim Aufruf des operator== sogar zwei (linke Seite und rechte Seite). Die constness des rechten Objektes markierst Du durch den Parametertyp (const IOPinConfig&). Das linke Objekt ist jedoch das this-Objekt. Da es dafür keinen expliziten Parameter gibt, wandert das const in dem Fall hinter die Deklaration.

    Vielleicht zur Veranschaulichung:

    // als externer Operator
    bool operator==( const IOPinConfig& a, const IOPinConfig& b );
    
    // innerhalb der Klasse
    class IOPinConfig 
    {
        bool operator==( const IOPinConfig& b ) /* was oben a ist ist hier (*this), deshalb -> */ const;
    };
    


  • Okay, verstanden.

    Danke sehr.


Anmelden zum Antworten