Map of Maps
-
Hallo zusammen,
ich versuche gerade eine map von maps zu erstellen. Funktioniert auch aber ich weiß nicht wie ich die Werte ändern kann:
std::map<std::string, std::map<std::string, KLASSE> > testMap;Im Netz finde ich bislang noch keine Lösung die mir weiterhilft, oder ich verstehs einfach nicht genau.
-
Was ist dein konkretes Problem?
-
Welchen Wert willst du wie ändern?
Allgemein ist da dran überhaupt nichts besonderes, auf die äußere Map greifst du wie gewohnt zu. Das was du erhältst ist dann auch eine Map. Und auf die greifst du dann auch wie gewohnt zu. Je nachdem, wie du den Zugriff genau gestaltest, sind die beiden Zugriffe auch direkt verschachtelbar.
Beispiel, beide Male via operator[] zugegriffen:
testMap["foo"]["bar"] = irgendwas; // ändert das "bar"te Element in der "foo"ten Map in testMap.Entsprechend mit allen möglichen anderen Zugriffsmethoden, die ich aber nicht alle zeigen werde, oder mit Mischungen davon.
-
Hallo,
genau das wollte ich machen:
map<string, map<unsigned int, Klasse> > foobar; foobar["test"][3] = Klasse(arg1, arg2, arg3);Allerdings geht das bei mir nicht und wir mit folgendem Fehler quittiert, mit dem ich nichts anfangen kann:
268:34: error: use of deleted function 'AFC::MixtureFraction& AFC::MixtureFraction::operator=(const AFC::MixtureFraction&)' flame["test"][1] = MixtureFraction(chemistry, thermo, transport, properties, zPointValue); ^ In file included from automaticFlameletCreator.cpp:34:0: /home/shorty/OpenFOAM/development/flameletcreator/src/mixtureFraction/mixtureFraction.hpp:53:7: note: 'AFC::MixtureFraction& AFC::MixtureFraction::operator=(const AFC::MixtureFraction&)' is implicitly deleted because the default definition would be ill-formed: class MixtureFraction
-
Die Fehlermeldung sagt dir, dass dein Copy-Assignment-Operator nicht existiert/gelöscht wurde (use of deleted function). Da in der Map beim Zugriff auf ein nicht-existentes Element erstmal der Speicherplatz für die Value erstellt werden muss, wird ein "AFC::MixtureFraction" für dich erstellt, anschließend per = das objekt welches du selbst dort speichern willst hineinkopiert. Versuch es mit std::move, falls du einen move-assignment-operator implementiert hast, weiß leider grade nicht ob die map auch ein equivalent zu 'emplace_back' hat.
-
Es ist übrigens deutlich performanter - vorausgesetzt du willst nur zwei Keys, was ich annehme - wenn du eine map<pair<string, unsigned>, Klasse> verwendest.
Und ja, std::map hat emplace, wenn auch komisch zu nutzen:
foobar["test"].emplace(std::piecewise_construct, std::forward_as_tuple(3), std::forward_as_tuple(arg1, arg2, arg3))Siehe hier: http://en.cppreference.com/w/cpp/container/map/emplace
-
Hallo,
also via Move bekomm ich den gleichen Fehler.
Ich werde mir das anschauen, danke für die Antworten.
-
insert?