Evolutionärer Algorithmus/Strukturen
-
Hallo!
Sicher gibt es schon längst evolutionäre Algorithmen, denn noch möchte ich mich selbst auf dem Feld probieren. Einfach um ein paar Dinge nachvollziehen zu können.
Also, wenn mit meinem code alles soweit in Ordnung ist, warum spuckt der compiler die zuvor geposteten Fehlermeldungen aus?? Hab ich irgendein include vergessen? Am namespace kann es schliesslich auch nicht liegen.
Und inwieweit muss ich mir über das reserve keine gedanken machen? Ist es in Verbindung mit vectoren nicht ratsam die erwartete Kapazität anzugeben? Soweit ich weiss, nimmt das Erweitern des Vektors "viel" Zeit in Anspruch.
Gruss!!
-
Also, wenn mit meinem code alles soweit in Ordnung ist, warum spuckt der compiler die zuvor geposteten Fehlermeldungen aus?
Welchen Compiler nutzt du denn?
-
da fehlt ein semikolon am ende von
LoKi.aK schrieb:
headerDatei der zweiten Klasse:
-
Meine IDE ist WxDev, das ja standardmäßig mit MinGW als compiler kommt. Ja, da fehlt doch wirklich so ein drecks semikolon...ändert aber auch nichts an der Fehlermeldung.
-
LoKi.aK schrieb:
Und inwieweit muss ich mir über das reserve keine gedanken machen? Ist es in Verbindung mit vectoren nicht ratsam die erwartete Kapazität anzugeben? Soweit ich weiss, nimmt das Erweitern des Vektors "viel" Zeit in Anspruch.
Wenn du ungefähr weisst, wie viel Speicherplatz der
std::vectorbenötigt, istreserve()okay. Aber wenn du zuerst eine komplizierte Abschätzung durchführen musst, mit der du dann trotzdem in der Hälfte der Fälle falsch liegst, überlässt du die Speicherverwaltung lieber demstd::vector. Eine Reallokation dauert erst spürbar lange bei wirklich vielen bzw. grossen Elementen, dafür kannst du in einigen Fällen Speicherplatz sparen.
-
Da bei mir im worstcase 1024x1024 vectorelemente vom typ SingleRes möglich sind, dachte ich mir, lege ich im ersten Schritt 1/4 der Maximalmenge vor. Eine Reduzierung am Schluss auf die tatsächliche Kapazität sollte ja doch nicht kompliziert/aufwendig sein, da vectoren doch bei operationen auf die letzten elemente einen geringen(/konstanten) zeitaufwand haben!?!?
Könnten die Fehlermeldungen mit meinem compiler zusammenhängen? Inwiefern?
-
LoKi.aK schrieb:
Eine Reduzierung am Schluss auf die tatsächliche Kapazität sollte ja doch nicht kompliziert/aufwendig sein, da vectoren doch bei operationen auf die letzten elemente einen geringen(/konstanten) zeitaufwand haben!?!?
Nicht kompliziert, aber unmöglich. Ein
std::vectorgibt den angeforderten Speicher eigentlich erst im Destruktor wieder frei. Von daher solltest du vorsichtig sein mit präventiven Allokationen. Vielleicht besser, du überlässt das Speichermanagement demstd::vector.Und die Operationen auf dem letzten Element haben eine (amortisiert) konstante Zeitkomplexität, jedoch gehen darunter eigentlich keine Reallokationen. Diese tragen nur zum "amortisiert" bei, in den meisten Fällen sind sie nicht nötig. Aber du kannst auch keinen Speicherbereich verkleinern, ohne ihn neu anzulegen.
-
Ok, war der Meinung man könne mit erase den vector zu schluss anpassen. Dabei veränder ich aber nur die Anzahl der Elemente, nicht die Größe des allokierten Speichers.
Eine andre Frage, die wahrscheinlich in blutigste Anfängerkategorie gehört:
Ich habe in der Signatur(Übergabeparamter) zweier Funktionen zwei Variablen mit gleichem Namen deklariert, wobei die eine Funktion in der anderen aufgerufen wird. Soweit ich weiss, sind lokale Variable "gekapselt", d.h. die eine Variable in der inneren bekommt beim Durchlaufen ihrer Funktion nichts von der anderen in der äußeren Funktion mit. Oder kann es da doch zu Komplikationen kommen?Zuletzt noch eine ältere Frage:
Es geht darum, dass ich ein und dieselbe Funktion in verschiedenen Klassen brauche. Muss ich die Funktion also mehrfach schreiben? Wahrscheinlich nicht. Löst man das Problem über Bibliotheken? Oder gliedert man die gemeinsam genutzten Funktionen aus-z.B. in eine Klasse MathOpera-und erzeugt in den jeweiligen Klassen Objekte dieser MathOpera-Klasse?Sry, dass ich hier teilweise Anfängerfragen poste. Bin noch nicht lange dabei und bin bei vielem noch unsicher, da ich es nicht genau weiss!
Thx
-
Deklariere die Funktion einfach außerhalb einer Klasse in einem Header, und implementiere sie dann in einer cpp Datei. In C++ musst du nicht alles in Klassen stecken

-
LoKi.aK schrieb:
Ich habe in der Signatur(Übergabeparamter) zweier Funktionen zwei Variablen mit gleichem Namen deklariert, wobei die eine Funktion in der anderen aufgerufen wird.
Sofern die Variablen in unterschiedlichen Scopes deklariert wurden (im gleichen Scope ist gar nicht möglich), benutzt du automatisch die des innersten Gültigkeitsbereiches, also quasi die lokalste. Innerhalb einer Funktion sind nur Parameter, globale und lokale Variablen bekannt - nicht aber die aus anderen Scopes.
LoKi.aK schrieb:
Es geht darum, dass ich ein und dieselbe Funktion in verschiedenen Klassen brauche. Muss ich die Funktion also mehrfach schreiben?
Nein. Mehrfach schreiben solltest du grundsätzlich nichts. Implementiere die Funktion wie von otze erwähnt als freie Funktion, eventuell in einem eigenen Namensraum. Es hat keinen Sinn, eine Klasse "MathOpera" zu erzeugen, die nur ein paar Funktionen zusammenfasst. Da machst du lieber einen
namespace.