Datenstruktur zum Suchen aus konstanter Datenmenge
-
Das programm wird eine Art Quelltext-parser.
Ich habe in einer externen Datei Definitionen stehen, die mir sagen, welche Argument welche Funktion hat.
Also z.b.:
UnitItemInSlot=item,unit,integerJetzt will ich beim Parsen des Quelltextes natürlich wissen, welcher Parameter welchen Typ hat.
Da würde sich eine Map und ein dynamisches Array anbieten, da ich dann über MyMap['UnitItemInSlot'][1] auf "unit" zugreifen könnte
Aber Probleme:- Welche struktur nehme ich statt dem Array? Das Array hat den Vorteil des einfach zugriffs per index, aber ich müsste es doch manuell freigeben (ist vermutlich nur am Ende des Programmes), richtig?
- Ich habe >800 Funktionen (als txt vorliegen) Wie kriege ich die in eine Struktur? Ich glaube der Programmstart würde sich stark verzögern, wenn ich den erst die Datei parsen lasse.
Ein ähnliches Problem habe ich mit Konstanten (als Strings), die z.T. umbenannt werden müssen. Das allerdings anhand eines Typs. Die Definition habe ich wieder als txt und sieht so aus:
RectNull=rect,null
SoundNull=sound,null
LimitOpEqual=limitop,EQUAL
Soll heißen: Ein Parameter, der vom typ "rect" ist (lt. obiger Tabelle) und "null" ist (ist wirklich so als String da) soll in "RectNull" umbenannt werden.
Hier sind es >1000 Konstanten.
Gleiches problem wie oben: Wie kriege ich die in eine Struktur ohne was von Hand zu machen?
Wie sieht es mit der Suchzeit aus? Sollte ich da lieber eine Map so machen: map<typ,map<name,Ersetzung>> machen, oder verbraucht das vl zu viel Speicher?
Oder eher nur eine Map und als Key "typ|Name" ("|" kommt in Typ und Name nicht vor)?Ich habe eine RegExp fähigen Editor, den ich schon oft verwendet habe um Konstanten-Arrays zu erstellen. Damit kann man also gut formatieren.
Aber ich weiß ebn nicht wie.
-
Mach dir nicht so viele Gedanken über Performance sonder sieh lieber zu, dass du ein schönes, sauberes Programm schreibst. Falls es doch Performanceprobleme geben sollte, kann man bei einem sauber geschriebenem Programm relativ einfach die kritischen Stellen verbessern.
Im Übrigen: 1000 Datensätze? Das ist doch wohl nicht dein Ernst, dass du damit Speicher- oder Geschwindigkeitsprobleme bekommst! Bei einem C64 waren 1000 Datensätze der Bereich, wo man sich so langsam mal Gedanken um Performance machen sollte. Wenn's ein paar Milliarden Datensätze wären, dann solltest du dir auch auf einem modernen Computer mal Gedanken machen.
-
Nja, das Programm so wie es vorher war brauchte 5s um einen kleineren Quelltext zu bearbeiten. Und da waren noch nicht so "gründliche" Techniken wie diese Listen im Einsatz, sondern da wurde noch viel geraten oder aus arrays genommen. Wenn was nicht "gewusst" war, wurde es übersprungen.
Meine Bearbeitung soll es komplett machen.Ok, dann Performance ist zweitrangig. Vorerst.
Wie kriege ich die Maps gefüllt? Muss ich wirklich Dateien mitliefern oder die in den Ressourcen speichern?
-
Flamefire schrieb:
Wie kriege ich die Maps gefüllt? Muss ich wirklich Dateien mitliefern oder die in den Ressourcen speichern?
So wie du es für sinnvoll hältst. Beides hat Vor- und Nachteile. Ich weiß nicht genug über dein Projekt um das abzuwägen. Im Zweifelsfall sollte man externe Dateien nehmen.
Prinzipiell möglich ist es schon, die Daten in das Programm einzucompilieren, wenn man das möchte. Die übliche Technik ist es, sich den entsprechenden Code automatisiert erstellen zu lassen, entweder mit eine externe Scriptsprache oder (wenn man zuviel Zeit hat und eine kleine Herausforderung will) über den Präprozessor.
edit: Betreffend deinem ersten Beitrag: Wenn du die STL-Container benutzt (ich nehme mal an mit dynamischem Arry meinst du std::vector), dann musst du nichts manuell freigeben, die sind vollautomatisiert.
-
- nimm std::vector.
- pack alle funktionen in EIN file, dann ist es auch kein grosses ding 800 funktionen zu parsen. 800 files zu lesen könnte dagegen ein paar sekunden dauern.