map::insert



  • Ich habe eine Map, wo einem pair als Key, einer Klasse zugeordnet wird, d.h.

    map <pair<string, int>, KLASSE> Test;
    

    Darüber hinaus habe ich eine set von pairs, die ich jetzt durchgehe um zugeordnete Klassen zu erstellen.

    Die Klasse hat genau zwei Membervariablen, nämlich gerade die aus dem pair<string, int>. Mit dem Konstruktor weise ich diesen beiden Members bei der Deklarierung gleich ihre entsprechenden Werte zu. Dies funktioniert auch, weil meine Ausgabe die Werte anzeigt.

    for (set<pair<string,int> >::iterator it = MengeStringInt.begin(); it != MengeStringInt.end(); it++)
    {
    KLASSE MeineKlasse( it -> first , it -> second );
    cout << MeineKlasse.Getfirststring() << " " << MeineKlasse.Getsecondint() << " " ;
    cout << (*it).first << " " << (*it).second << endl;
    
    //Test[*it] = MeineKlasse;	
    }
    

    Was scheitert?
    Meine letzte auskommentierte Zeile. Ich kann meine Map nicht füllen. Ich will einen Eintrag machen, aber es funzt nicht. Kurioser ist, dass wenn ich das Ganze ohne Konstruktor mache und stattdessen mit set-Methoden meine Klasse fülle. Dann kann ich die letzte Zeile ausführen und meine map tatsächlich füllen.

    Welche Fehlermeldung bekomme ich?
    Irgendsowas in die Richtung "Instantiated from here" ... Aber der Fehler muss doch ganz klein sein, wenn es ohne Konstruktor funktioniert oder?

    Danke schonmal!



  • Kann es sein, dass der Compiler wegen der Verwendung des set-iterators meckert?

    Versuche doch mal, den iterator einem pair zuzuweisen und verwende das für die map-Addressierung. Wenn das klappt, liegt es an der Typinkompatibilität.


  • Mod

    Das liegt da dran, dass der map-Operator[] in Zeile 7 eine Referenz auf ein neues Objekt liefert, auf den du dann den Zuweisungsiterator anwendest. Dieses Objekt muss aber irgendwo herkommen. Dazu braucht die map einen Konstruktor ohne Argumente.

    Lass dich nun aber nicht dazu bringen, einen sinnlosen Standardkonstruktor zu definieren, sondern nutz stattdessen insert zum Einfügen und find zum Herausholen von Werten.



  • ein vollständiges minimalbeispiel bitte mit vollständiger fehlermeldung.



  • @iterator++: Gleicher Fehler
    @SeppJ: Verdammt, ich habs nichts gecheckt aber mit der insert-Methode gehts, also

    Test.insert ( pair<pair<string, int>, KLASSE> (*it,MeineKlasse) ) ;
    

    Fazit: Lieber Insert-Methode als []-Operator?


  • Mod

    Mathias1986 schrieb:

    Fazit: Lieber Insert-Methode als []-Operator?

    Nein. Die beiden machen eben etwas anderes. Wenn du Elemente einfügen willst, dann insert, denn dafür ist es, wie der Name schon sagt, da. Dieser Fall liegt hier vor.

    Wenn du die Funktionalität von Operator[] brauchst (also Zugriff auf vorhandene Elemente und ggf. Einfügen eines Neuen), dann nimm Operator[]. Letzteres ist dann von der Funktionalität her nicht kompatibel zu dem Modell eines Objekts ohne Standardkonstruktors. Es sollte dann aber von der Programmlogik her nirgends vorkommen, dass man die Funktionalität von Operator[] braucht. Hier kam der Fall vor, da du Einfügen wolltest, aber dafür nicht insert genommen hast.



  • SeppJ schrieb:

    Mathias1986 schrieb:

    Fazit: Lieber Insert-Methode als []-Operator?

    Nein. Die beiden machen eben etwas anderes. Wenn du Elemente einfügen willst, dann insert, denn dafür ist es, wie der Name schon sagt, da. Dieser Fall liegt hier vor.

    Wenn du die Funktionalität von Operator[] brauchst (also Zugriff auf vorhandene Elemente und ggf. Einfügen eines Neuen), dann nimm Operator[]. Letzteres ist dann von der Funktionalität her nicht kompatibel zu dem Modell eines Objekts ohne Standardkonstruktors. Es sollte dann aber von der Programmlogik her nirgends vorkommen, dass man die Funktionalität von Operator[] braucht. Hier kam der Fall vor, da du Einfügen wolltest, aber dafür nicht insert genommen hast.

    Mir bleibt nichts anderes zu sagen außer: Danke, ich habs gecheckt! 🙂 ... und weiter geht's ...


Anmelden zum Antworten