Eine Frage zur Speicherverwaltung
-
m[1] = iVector;Dir ist schon klar, das du hier einen Typ und keine Variable/Objekt hinzufügst?

typedef vector<int> iVector; // Typdefinition! Nix Variable!
-
Na ich dachte bei new bleibts ja auch weg und den Namen kann ich nachher eh nicht verwenden... och dieses Speicherzeugs macht mich noch fertig
aber irgendwann wird man auch das kapiert haben.
-
-
btw, ich wußte gar nicht, daß vector<> eine implizite Umwandlung nach bool anbietet
(will heißen: wie hast du es geschafft, das if(m[1])...durch den Compiler zu bekommen? und was willst du dort überhaupt prüfen?)
-
TheGrudge schrieb:
Ich würde gerne meine Map umbauen und habe nun überlegt, einen Vector zu nehmen und damit die Koordinaten zu speichern.
Der Key der Map soll das Label sein (eine ID-Nummer), der Vector enthält nun die Koordinaten.
Jetzt scheine ich aber nur mit new arbeiten zu können, denn ich bekomme Compilerfehler wenn ich folgendes probiere:
typedef vector<int> iVector; typedef map<int,iVector> myMap; myMap m; if (m[1]) m[1].push_back(11); else m[1] = iVector;Vielleicht baue ich auch nur wieder Mist
Jedenfalls soll es so sein, das wenn kein Vector existiert, soll er angelegt werden, ansonsten ein push_back erfolgen.Diese Version funktioniert hingegen:
typedef vector<int> iVector; typedef map<int,iVector*> myMap; myMap m; if (m[1]) m[1]->push_back(11); else m[1] = new iVector;Wieso muss ich hier nun new nutzen? Das kapiere ich noch nicht, kann der vector nicht "anonym" in der map leben?
So:
typedef vector<int> iVector; typedef map<int,iVector> myMap; myMap m; m[1].push_back(11);m[l] legt automatisch ein Objekt an, wenn es nicht exisitiert. Willst Du wissen, ob ein Objekt in der map ist, dann geht das so:
if (m.find(l) == m.end()) // kein vector zu l gefundenist doch ganz einfach. Immer noch kein new und keine Probleme mit der Speicherverwaltung.
-
tntnet schrieb:
[...]
m[l] legt automatisch ein Objekt an, wenn es nicht exisitiert. Willst Du wissen, ob ein Objekt in der map ist, dann geht das so:if (m.find(l) == m.end()) // kein vector zu l gefundenist doch ganz einfach. Immer noch kein new und keine Probleme mit der Speicherverwaltung.
Ich hab das bis jetzt immer folgendermaßen gemacht:
if (m.count(l) == 0) // kein vector zu l gefundenIst find() schneller/besser/sauberer?
-
Beliah schrieb:
if (m.count(l) == 0) // kein vector zu l gefundenIst find() schneller/besser/sauberer?
War mir gar nicht bewusst, daß es in der map ein count gibt. Das macht ja eigentlich keinen Sinn, da die Schlüssel einzigartig sind und daher count nur entweder 0 oder 1 liefert. Aber eigentlich ist Deine Lösung tatsächlich kürzer und lesbarer, ausser daß es mich erst mal irritiert hat, daß es diese Methode überhaupt gibt.
-
tntnet schrieb:
War mir gar nicht bewusst, daß es in der map ein count gibt. Das macht ja eigentlich keinen Sinn, da die Schlüssel einzigartig sind und daher count nur entweder 0 oder 1 liefert. Aber eigentlich ist Deine Lösung tatsächlich kürzer und lesbarer, ausser daß es mich erst mal irritiert hat, daß es diese Methode überhaupt gibt.
Oh, das war mir auch neu. Man lernt nie aus

<ratemodus>
Ich würde sagen count (lower_bound, upper_bound) bei map und set gibt es, um das Interface mit multiset und multimap identisch gestalten zu können, und bei letzteren gibt es sie, um einen effizienten Ersatz für die entsprechenden Algos zu haben.
</ratemodus>
-
tntnet schrieb:
[...]
Aber eigentlich ist Deine Lösung tatsächlich kürzer und lesbarer, ausser daß es mich erst mal irritiert hat, daß es diese Methode überhaupt gibt.Ich hab mich bis jetzt eigentlich nie gewundert

Aber das mit multimap klingt plausibel.Ich denke aber das find() besser ist da die Funktion einen iterator zurückgibt denn man dann einfach nur auf end() überprüfen muss was sicherer sein wird als std::map<>::size_type auf 0 zu überprüfen.
-
Also der Vergleich zweier size_t-Werte ist genauso einfach wie der Vergleich zweier Iteratoren. Die Frage ist nur, wie count() intern arbeitet (plausibelste Möglichkeiten wären
return distance(lower_bound(x),upper_bound(x));oderreturn (find(x)!=end())?1:0;- in jedem Fall dürfte es nicht wesentlich schneller sein als der find()-Aufruf).