Frage zu ner Map und dazugeh. Iterator
-
Wie würde das denn codemäßig aussehen?
-
Hallo,
typedef std::map<std::string, float> MyMap; class buchfuehrung { private: MyMap mapA; public: //... bla MyMap::const_iterator getmapA() { return mapA.begin(); } }; //irgendwo im code MyMap::const_iterator cit = foo.getmapA(); //tue was mit cit
mfg
v R
-
-
Ingo schrieb:
So sieht die Headerdatei meiner Klasse, bis auf die Knochen reduziert, aus:
class buchfuehrung { private: std::map <std::string, float> mapA; public: //... bla std::map <std::string, float> getmapA();//soll man auslesen können ohne umzukopieren };
Wenn ich jetzt mapA im Hauptprogramm auslesen möchte, mach ich das so:
map <string, float> m; map <string, float>::iterator it; m = bf.getmapA(); for (it = m.begin(); it != m.end(); ++it) ...
Wie kann ich auslesen, ohne immer in eine neue map, hier "m", umzukopieren? Das ist ja Ressourcen- und Zeitverschwendung in Reinform. Muss ich sie dafür public machen? Das wäre aber schlecht, weil dann jeder reinschreiben könnte.
Danke für nen Hinweis.Wenn Du auf die gesamte map zugreifen willst, dann kannst Du Deine Methode
folgendermaßen schreiben:std::map <std::string, float> &GetMap() { return mapA; }
Falls Du nur lesend auf die Map zugreifen willst, kannst Du auch const & schreiben.
Die Zuweisung lautet dann:
std::map <std::string, float> &map = bf.GetMap();So wird immer nur die Referenz auf Deine Membervariable zurückgegeben, ohne zu kopieren.
hth
chris
-
Danke, das funktioniert auch sehr gut.
-
Ich habe zur map noch eine Frage. Dies sei ein bestehender Eintrag:
m.insert(pair<string, float>("abc", 39));
Ein Kunde gibt nun wieder abc, diesmal aber mit dem Wert 40, ein. 40 soll in die map übertragen werden. Da der Schlüssel gleich ist, behält die map aber 39.
Wie kann ich die Annahme des veränderten Wertes erreichen?
-
Warum benutzt du überhaupt insert?
m["abc"] = 39;
-
Für die Antwort: thx.
Was schlägst du statt insert vor?
-
Hat er doch gezeigt: den operator[]
-
Ich muss aber erst überprüfen, ob der Wert doppelt vorkommt. Muss ich dazu die gesamte map durchiterieren, oder kann man das schneller feststellen?
-
Ich denke der operator [] macht genau das was du willst;
wenn der schlussel "abc" schon vorhanden ist wird der wert überschrieben
andernfalls wird ein neues element eingefügt.
korrigiere mich wenn ich dich falsch verstanden habe.
K.
-
Der Operator [] hilft mir, danke.
In fast allen Büchern (Kirch-Prinz, Schild...) lese ich merkwürdigerweise fast immer nur m.insert..., um Schlüssel und Werte in eine Map einzutragen. Das mit dem Operator kam mir daher gar nicht in den Sinn.