map refenziert daten aus vector
-
#include <map> #include <vector> #include <string> #include <boost/lexical_cast.hpp> #include <iostream> class Person { public: Person(const std::string &FirstName,const std::string &LastName,int Age) :m_FirstName(FirstName),m_LastName(LastName),m_Age(Age) {} std::string getLastName() const { return m_LastName ; } void setLastName(const std::string &LastName) { m_LastName=LastName ; } void setAge(int Age) { m_Age=Age ; } int getAge() const { return m_Age ; } private: std::string m_FirstName ; std::string m_LastName ; int m_Age ; }; int main() { typedef std::vector<Person> Persons ; typedef std::map<int, Person*> RefMap ; Persons Data ; RefMap Refence ; std::string FirstName="Sepp" ; for (int i=0;i< 100;i++) { std::string SecondName="Meier_"+boost::lexical_cast<std::string>(i) ; Person aPerson(FirstName,SecondName,i) ; Data.push_back(aPerson) ; Person &ref=Data.back() ; Refence[i]=&ref ; } RefMap::iterator FindIter=Refence.find(10) ; Person *TestPerson=FindIter->second ; std::cout << TestPerson->getLastName() << " " << TestPerson->getAge() << "\n" ; TestPerson->setLastName("the Cat") ; std::cout << Data[10].getLastName() << " " << Data[10].getAge() << "\n" ; }Ich verstehe nicht warum ich nicht das gewünschte Ergebnis sehe.
Der Wert von LastName müsste doch geändert werden.
Allerdings wird beim g++ Leer ausgeben bzw. beim Borland Compiler "Meier_10".
Danke für eure Hilfe.
-
Data.push_back(aPerson);
Diese Operation könnte die kompletten Objekte an eine andere Stelle im Speicher verfrachten. Damit zeigen die Zeiger in deiner Map nicht mehr auf die richtige Stelle. Ich denke mal, deine Probleme stammen anschließend aus diesem fehlerhaften Speicherzugriff, der bei unterschiedlichen Compilern natürlich zu unterschiedlichen Ergebnissen führen kann. Du wärst in deinem Fall also besser damit beraten, indizes in den Vektor der Objekte zu speichern, statt Zeiger auf sie.
-
Danke für deine Antwort.
So was in der Art habe ich mir auch schon gedacht.
Werde jetzt in meiner Map im Datenbereich den Index vorhalten.
-
case schrieb:
Werde jetzt in meiner Map im Datenbereich den Index vorhalten.
Ich persönlich würde in so einem Fall (falls möglich) std::vector<Person> in std::vector<Person*> ändern und die Objekte auf dem Heap anlegen.
Freigeben natürlich nicht vergessen...
-
Wäre auch eine Idee.
Da aber der vector nach aussen gegeben werden muss,
wäre das Ganze nicht so optimal.Der Caller müste sich um die Freigabe kümmern, oder ich müsste den "Pointervektor" in einen "normalen Vektor umkopieren".
Den Pointervektor an den Caller weiter zu reichen sehe ich nicht als optimal.
Ich frage mich was in dem Fall schneller wäre Vektor um zu kopieren, oder intern mit der Map mit den Indexen zu arbeiten.
-
Den Inhalt des std::vector löschst du, wenn der std::vector selbst gelöscht wird.
Alles andere (Ausnahme: Löschen am Ende) macht mit dem Index (wegen Verschiebungen) auch Probleme.Wenn du den std::vector nach aussen geben willst, dann gib ihn als const zurück...
-
Naja, wenn man das wirklich vernünftig machen will, bleibt keine andere Möglichkeit, als die beiden Container hinter einer Schnittstelle zu verstecken, die etwaige änderungen an beiden Containern entsprechend auf den anderen überträgt. Aber wenn man nur intern fix was basteln will und weiß, dass man nur push_backs verwendet, dann sehe ich mit den Indizes kein Problem.