Objekt in die Map einfügen

BLR

Erfahrenes Mitglied
Hallo zusammen, ich möchte in eine so definierte map:

C++:
map<Auto*, string> autoModelle;

ein Auto-Objekt einfügen.

ich habe einen Vector mit autos, die ich durchgehe:

Code:
vector<Auto*> autos;
for (int i = 0; i < this->autos.size(); i++) {

     
        if (autos.at(i)->getNr() == nr) {

            autos.at(i)->setStatus(true);
          
            this->autoModelle.insert(autos.at(i), name);
            //hier gebe ich zwar einen Zeiger zurück mit "at", dennoch funktioniert das leider nicht
        }
}


Danke für jeden Tipp.
 
Zuletzt bearbeitet:
Sorry, ich habe eben kurz meinen Beitrag noch geändert.
Die Fehlermeldung ist, dass es sagt: No match Call for such function.....
 
for Function...? Welche, wo, usw.usw., der Compiler sagt dir sicher mehr (und richtig geschrieben).
Man kanns doch einfach hier reinkopieren.
 
Jaa...ich habe etwas mit der map experementiert.
Und hier in der Doku wird immer beschrieben, dass man ein "std::make_pair" verwenden sollte.
Ich habe vorhin einfach versucht: myMap.insert(new myObjekt, "name") einzufügen, was nicht funktioniert hat.

Was ich eigentlich versuche zu erreichen ist, dass der Iterator von der Map mir direkt nach dem Einfügen auf das eingefügte key-value Paar zeigt.
Zunächst habe ich mir gedacht, dass ich auf den letzten Eintrag zeigen soll, aber die map fügt sie sortiert ein, sodass der letzte Eintra nicht unbedingt der neuste Eintrag ist.
Wonach sortiert er? nach dem Key oder nach dem Value beim "Insert" ?

Hier sind die Zeilen, worauf es ankommt:

C++:
myMap.insert(std::make_pair(myObjekt.at(i), name));
map<Zimmer*, string>::reverse_iterator itr = myMap.rbegin();
cout << "Das Objekt: " << itr->first->GetNummer() << " mit dem Status: " << itr->first->IsStatus();

Hier wird mir immer das letzte Element ausgegeben, anstatt dem zuletzt eingetragenen.
Wie kann ich den Iterator auf den aktuellsten Eintrag zeigen lassen?

Danke für jeden Tipp.
 
Hallo BLR

Eine Map wird diese Anforderung nur erfüllen, wenn dein letzter eingefügter Key der grösste aller Keys sind. Wie du im Standard nachlesen kannst (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf Abschnitt 23.4.2):
Each associative container is parameterized on Key and an ordering relation Compare that induces a strict weak ordering (25.4) on elements of Key

/EDIT
Natürlich muss das nicht unbeding die Ordnung < sein, wie im unteren Beispiel dargelegt. Kann auch irgendwas anderes sein, was einer strengen, schwachen Ordnung entspricht
/EDIT ENDE

Kannst du relativ einfach verifizieren:
C++:
    std::map<int, int> a;
    a.insert(std::make_pair(0, 100));
    a.insert(std::make_pair(-1, 200));
    a.insert(std::make_pair(1, 300));
    a.insert(std::make_pair(-2, 400));

    for (auto& pair : a) {
        std::cout << pair.first << " = " << pair.second << std::endl;
    }

Ausgabe:
-2 = 400
-1 = 200
0 = 100
1 = 300

Eine Möglichkeit das zuletzt eingefügte Element zu finden gibt es nicht, ausser du speicherst den Rückgabewert von map.insert.

Warum beginnst du eigentlich mit Automodellen und bist jetzt plötzlich bei Zimmern?

Grüsse
Cromon
 
Zuletzt bearbeitet:
Hallo

Gerade bei der Map ist operator[] immer eine gute, angenehme Wahl, um Dinge einzufügen. Schlicht, weil es sehr wenige Zeichen benötigt und das make_pair entfällt.

C++:
Auto* a = new Auto();
std::map<Auto*, std::string> automap;
automap[a] = "BMW X5";
Also eigentlich wie ein Vektor zu behandeln. Einzige Ausnahme: Objekte finden sollte man mit std::map::find, da mit dem operator[] das Objekt immer angelegt wird.

Gruss
cwriter
 

Neue Beiträge

Zurück