Speicherverbrauch std::map & Membervariablen
-
CStoll schrieb:
Wie gesagt, schau dir mal den Header <deque> an - irgenwo dort drinn dürfte stehen, wie groß die Speicherblöcke sind, die eine Deque jeweils am Stück anfordert.
Also, da muss ich mich dann wieder als doof outen. Ich nutze eclipse mit CDT. Wenn ich da auf die Definition einer deque klicke mit Strg gedrückt, dann leitet der mich weiter a eine Datei /usr/include/g++/bitsstl_deque.h
In dieser Datei habe ich keine explizite Angabe gefunden, wieviel Speicher denn nun reserviert wird. Aber das ganze ist mir auch irgendwie eine Nummer zu heavy zum Durchsteigen. Sieht schon ziemlich krass aus
-
Th schrieb:
Aber die Frage ist sowieso, ob hierfür eine deque benutzt werden sollte (da diese nur zusätzliche Vorteile beim Anfügen an die erste Position bringt - gegenüber einem vector).
Und stimme dir zu: wenn die Größe von vornherein feststeht, dann einfach ein konstantes Array aufbauen (ist schneller, da nicht immer wieder reallokiert werden muß).
Okay, dann erklär ich kurz, wieso deque (wird aber kompliziert :))
Ich bekomme sequenziell eine große Menge von ints. Über diese gehe ich mit einem Fenster konstanter Länge drüber. Das sieht dann so aus:
deque<int> _deq; map<deque<int>, int> _slidingWindowMap; void addInt(const int & a) { if (_deq.size() >= MAXSIZE) { _deq.pop_front(); } _deq.push_back(a); ...Jetzt suche ich alle möglichen Sequenzen innerhalb dieser deque.
Wenn in der also 1,2,3,4,5 drinsteht, dann erzeuge ich mit folgende neue Zahlenketten daraus:1,2 1,2,3 1,2,3,4 1,2,3,4,5 2,3 2,3,4 2,3,4,5 3,4 3,4,5 4,5Das sieht so aus:
... // Fortsetzung addInt() deque<int> tdeque(11); unsigned int pos; // pos = starting position for small interval that has to be saved for (unsigned int i = 2; ( (i <= MAXSIZE) && (i <= _deq.size())); i++) { // i == size of small interval tdeque.clear(); tdeque.resize(11); if (_deq.size() < MAXSIZE) { // check if _deq is not big enough (thats the case at beginning of program) pos = _deq.size() -i; } else { pos = MAXSIZE -i; } for (unsigned int j = 0; j < i; j++) { tdeque.push_back(_deq.at(pos+j)); } // for _slidingWindowMap[tdeque]++; // if tdeque is present, inc its counter, otherwise insert it with counter set to 1 } // forUnd diese deques (1,2 2,3 etc (sind in tdeque)) will ich in ihrer Häufigkeit zählen.
Ich hoffe, ich habe jetzt im Code hierdrüber keine Fehler eingebaut. Ist so aus meinem Prog übernommen.
Jetzt, wo ich das abtippe und drüber nachdenke, kann ich aber auch nicht mehr sagen, wieso ich da eigentlich deques abspeichere. Da brauch ich die Fähigkeit mit pop_front ja gar nicht...
Hätte also auch ein Vector ausgereicht...
Naja, gut, wenn man selbst mal über seinen Code nachdenkt
Th schrieb:
P.S: Ich habe auch eine eigene Array-Klasse mit maximaler Größe (bzw. 2, da eine die max. Größe als Template-Parameter nimmt, die andere als Parameter im Konstruktor).Bei Bedarf verschicke ich sie gerne...
Gern. benja a t gmx. net
-
Soo, wie vermutet liegt es an dem Konstrukt
map<deque<int>, int>das habe ich ersetzt duch
map<vector<int>, int>und der Verbrauch von Arbeitsspeicher ist jetzt in Regionen, die ich überschauen und nachvollziehen kann.
Mein Problem ist also gelöst. Danke nochmal an CStoll, Th und die anderen netten Helfer !!