 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 12.07.2006, 20:58 Titel: Vector: Element an beliebiger Stelle |
|
|
Hey,
ich habe eigendlich nicht wirklich eine Frage, sondern würde nur gerne eine Bestätigung bekommen, ob es nicht auch anders (besser) geht.
Wenn ich bei einem (std::)Vector an einer beliebigen Stelle ein Element einfügen will habe ich das folgendermaßen implementiert:
-> Schaun ob Vector lang genug ist
-> Ja -> Objekt einfügen
-> Nein -> Vector verlängern und dann Objekt einfügen
Aber kann da der Container nicht mehr ? Bei Insert gab es immer eine Exception, wesshalb ich vermute das dort der Vector auch mindestens so groß wie der Indexwert hoch ist sein muss. _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 12.07.2006, 21:36 Titel: |
|
|
Wenn du das Objekt einfügst, dann überschreibst du doch ein anderes, oder?
Tatsache ist, ein Vektor hat alle Daten hintereinander im Speicher. Wenn du ein objekt in der Mitte einfügst, musst du zwangsläufig alles was dahinter steht umkopieren. Evtl. sogar den ganzen Vektor, fals du mehr speicherplatz benötigst.
Um Objekte in der Mitte enzufügen bneutzt man besser list, aber du wirst shcon deine Gründe für Vektor haben. Also, solange diene Lösung daraus besteht, das alles hinter dem neuen element einmal kopiert werdne muss, gehts wohl nicht schneller.
Achja, besser einmal für 10 Elemente mehr reservieren, als 3 mal für 3, da jedes reserveiren eben Zeit kostet. vorrausschauen fahren, äh programmeiren. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 12.07.2006, 21:37 Titel: |
|
|
eigentlich kannst du immer push_back() und push_front und so machen, da musst du net vorher reservieren. Wenn du aber vorher weißt, wie viel du genau willst, ist das Vorherreseevieren eine Möglichkeit, ein bisschen Effizienz zu gewinnen, macht aber net viel aus (laut Effektiv C++-Programmieren)
Gruß DXer |
|
Nach oben |
|
 |
Mat Senior JLI'ler

Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 12.07.2006, 21:53 Titel: |
|
|
Hmm .. danke schonmal, aber der springende Punkt ist nicht wie ich bewerkstellige, dass überhaupt Elemenente in den Vector kommen, sondern an bestimmte Stelle. Wenn dort bereits ein Element existiert, dann soll es überschrieben werden
PS: Vector benutze ich zum durchlaufen des Feldes, und gegebenenfalls zurückzuspringen etc. ist also denke ich hier besser zu verwenden als List.
Aus euren Aussagen interpretiere ich schonmal, dass Vector die Funktion (die ich im Kopf hatte) nicht besitzt ... gedacht war, dass egal wie groß der Vector derzeit ist, der Vector auf n Objecte (größe von Index) erweitert wird, falls nötig, und dort dann das Objekt reingeklatscht wird.
Ist aber auch nicht so dragisch: wie schon erwähnt: Habe bereits eine Implementierung, bin mir mit dem Stil aber nicht so 100% sicher
=> push_back() etc. ist desshalb schlecht, weil das Objekt ja gerade nicht ans Ende oder den Anfang soll, eben mitten rein  _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 12.07.2006, 22:55 Titel: |
|
|
Dann schau dir mal 'std::deque' an, dieser Container bietet weitesgehend die selbe Funktionalität wie 'std::vector', ist intern aber als doppelt-verkettete Liste implementiert, 'std::vector' als dynamisches Array, was bedeutet, dass bei der 'std::deque' einfach ein paar Zeiger umgebogen, bei 'std::vector' dagegen sämtliche Daten kopiert werden müssen.
Ich weiß nicht wie gut du dich mit den Algorithmen und Iteratoren der STL auskennst, aber wenn du mehrere Datensätze mitten in den Vector (bzw. die Deque) kopieren willst, würde sich der 'std::copy'-Algorithmus in Verbindung mit einem 'inserter'-Iterator-Adapter anbieten. |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 13.07.2006, 16:17 Titel: |
|
|
Nur zum durchlaufen sollte list nicht langsamer sein als Vektor.
Wenn du immer nur eins nach vonre oder zurück gehts ist es wohl egal, wenn du aber immer an eine bestimmte Position willst, z.B. 5 von vorne ist ein Vektor sehr viel schneller.
Ich benutez Vektoren eigenltihc relativ selten, für Gegner oder so benutze ich imemr list, da ich zum bewegen von allen eh die ganze Liste durchgehen muss. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|