JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Vector: Element an beliebiger Stelle

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 12.07.2006, 20:58    Titel: Vector: Element an beliebiger Stelle Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 12.07.2006, 21:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 12.07.2006, 21:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 12.07.2006, 21:53    Titel: Antworten mit Zitat

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 Wink

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 Confused

=> push_back() etc. ist desshalb schlecht, weil das Objekt ja gerade nicht ans Ende oder den Anfang soll, eben mitten rein Wink
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 12.07.2006, 22:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 13.07.2006, 16:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum