Speicherreservierung ja/nein?



  • Schau dir mal equal_range an
    equal_range liefert ein pair Iteratoren zurück, die den Bereich der Schiffe abdecken, die dem gewünschten Namen entsprechen. Also vom ersten bis eine nach dem letzten
    Dieser Range wird in der zweiten Schlaufe durchiteriert.

    PS: Nein ich habe keine Aktien von SGI...



  • Spartaner schrieb:

    CStoll schrieb:

    Ach, so schwer ist das auch wieder nicht. Dazu mußt du die Schiffstypen nur geordnet (z.B. nach Maximal-Hitpoints oder nach Schiffstyp) in den Vektor reinpacken und kannst dir dann per equal_range() einen bestimmten Flottenteil raussuchen lassen (z.B. equal_range(ships.begin(),ships.end(),"Kreuzer") liefert alle Kreuzer deiner Flotte.

    Das klingt interessant. Liege ich da richtig, dass diese Funktion einfach den letzten Eintrag im vector zurückliefert? Wenn z.b. bis zum Element 50 Kreuzer enthalten sind, so soll die Funktion eine 50 zurückliefern?

    Nein, equal_range liefert nicht die Anzahl der gefundenen Elemente, sondern ein Paar von Iteratoren - d.h. ship_range.first zeigt auf den ersten Kreuzer deiner Flotte, ship_range.second auf den ersten Nicht-Kreuzer.

    Edit@THX: Das heißt übrigens immer noch "Schleife" 😉



  • CStoll schrieb:

    Edit@THX: Das heißt übrigens immer noch "Schleife" 😉

    😃 Uups, sch**ss Helvetismen.



  • @ DEvent: Klar, darüber könnte man vorher eine Abfrage machen. Bloß wenn ich schon extra dafür Speicher reservieren sollte, dann würde es ja auch Sinn machen, wenn ich diesen direkt wieder freigebe und das Schiff aus der Liste entferne. Oder sollte man den Speicher einfach komplett am Ende der Simulation freigeben.

    Wenn du den Speicher in der Simulation freigibst, bringt das nur: a) extra Verwaltungsaufwand und b) Geschwindigkeitsnachteile.

    Aus a) folgt, das der Algorithmus unnötig verkompliziert wird und dadurch nochmal fehleranfälliger und langsamer wird.

    Was anderes wäre, wenn du in der Simulation Speicher anforderst, dann würde der Speicher unnötigerweise immer weiter zunehmen.

    Aber auch dann könnte man die "Leichen" drinnerlassen, bis zu einem Maximalwert, und dann einen Algorithmus starten, der die "Leichen" aus dem Speicher entfernt.

    Würde den Vorteil bringen, das es 2 Algorithmen sind, einen für die Simulation, einer für die Speicherverwaltung.



  • Danke noch mal für die Hilfe!

    Mit den Informationen werde ich jetzt erst mal weiter machen.

    Gruß Spartaner



  • pair<vector<c_ship>::iterator, vector<c_ship>::iterator> ship_range;
    ship_range = equal_range(ships.begin(),ships.end(),"Kreuzer")
    

    Ich habe hiermit noch ein kleines Problem. Wenn ich dies so nutzen möchte, bekomme ich den Fehler, dass er string nicht nach c_ship (meine Klasse) konvertieren kann. Das ist ja auch irgendwie verständlich und logisch. Die deklaration des Schiffstyps ist zwar in der Klasse vorhanden, aber mit ships.begin() .end() überprüfe ich ja ein ganzes Objekt der Klasse c_ship und nicht nur eine einzelne Membervariable.
    Kann ich den Vergleich so nicht machen oder habe ich mir die definition von equal_range nicht richtig angesehen und mache da einen großen Fehler?

    pair<vector<c_ship>::iterator, vector<c_ship>::iterator> ship_range;
    c_ship Kreuzer("Kreuzer");
    ship_range = equal_range(ships.begin(),ships.end(), Kreuzer)
    

    Übergebe ich der Funktion jetzt einfach ein Schiff, nach welchem er in dem vector suchen soll, so bekomme ich folgenden Fehler (wenn ich es noch richtig wiedergeben kann):

    _function_base.h(73) operator '<' ist im Typ c_ship für Argumente desselben Typs nicht implementiert.

    Ich verstehe einfach nicht wie dieser Fehler zustande kommt. Könnt ihr mir dabei noch mal helfen?

    Gruß Spartaner



  • Ich hoffe es ist in Ordnung *push* 😉



  • Da steht doch ganz klar, was das Programm von dir erwartet - die gesuchten Objekte müssen sortierbar sein (und nebenbei sortiert vorliegen ;)). Also solltest du den geforderten op< implementieren:

    bool operator<(const ship& l, const chip& r)
    { return l.name<r.name; }
    

    Edit: Und für den Aufruf kannst du auch eine temporäre Variable nutzen:

    ship_range=equal_range(ships.begin(),ships.end(),ship("Kreuzer"));
    


  • Mit dem Überladen von Operatoren habe ich mich bisher noch nie befasst, deshalb verstehe ich auch nicht wirklich, was damit bezweckt wird. Tut mir leid, vielleicht hätte ich mich da erst einlesen müssen, bevor ich dazu die Frage stelle...

    Wenn ich dies also so in meine Klasse implementieren, kommt die Funktion auch mit folgendem klar?

    ship_range = equal_range(ships.begin(),ships.end(),"Kreuzer")
    

    CStoll schrieb:

    die gesuchten Objekte müssen sortierbar sein (und nebenbei sortiert vorliegen ).

    Die einzelnen Objeke liegen ja sortiert in meinem vector. Halt so wie sie eingefügt wurde.



  • bool operator<(const ship& l, const chip& r)
    { return l.name<r.name; }
    

    Ich gehe mal davon aus, das dies einfach im public Teil der Klassendefinition steh muss.

    Allerdings bekomme ich nun den Fehler dass nur ein Parameter erwartet wird (vorhanden sein darf)

    Mir fehlt für das Überladen der Oparatoren einfach das Wissen. Ich verstehe nicht recht warum dies nötig ist und wie man es genau anstellt.

    Es wird wahrscheinlich zuviel verlangt sein, das mir dies jemand erklärt. Gibt es dazu denn irgendwo eine gut Verständliche Erklärung?


Anmelden zum Antworten