Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Geeigneter Container gesucht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.03.2007, 13:47 Uhr
Soto



Hallo,
ich möchte gewisse (viele!) Pointer in einen Container schreiben, diesen Container per Referenz an eine Funktion übergeben und in dieser Funktion dann, je nach Ausgang gewisser Tests, viele dieser Pointer wieder aus dem Container entfernen, um dann mit dem Rest weiterzuverfahren.
Gibts da eine Containerklasse aus der STL, die sich dafür anbietet? ZB. Vector oder List?
mfG,
Soto
--
ich versuche zu helfen, sorry wenn ich nen scheiß rede ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.03.2007, 13:57 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


ja, vector oder list
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.03.2007, 13:58 Uhr
Kest
saint


Hi!

Kommt drauf an, wie du auf die Daten zugreifen willst:
Liste, wenn du häufig in der Mitte einfügen oder entfernen will.
Deque, wenn am Anfang oder Am Ende.
Vector entspricht einem Array.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 19.03.2007 um 13:59 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.03.2007, 14:01 Uhr
virtual
Sexiest Bit alive
(Operator)


Du hast die Wahl zwischen verschiedenen Containern, welcher genau der richtige ist, hängt von weiteren Randbedingungen ab, die du jetzt nicht erwähnt hast.

Mir fallen jetzt speziell std::vector, std::list und std::set ein

std::vector ist vergleichsweise beliebt, wegen seiner intuitiven Benutzungweise, die man von Arrays her kennt. Wenn du oft auf das N-te Element zurgriefen musst (RandomAccess), ist dies eine recht günstige Wahl. Allerdings hat ein vector den Nachteil, bei vermehrten Lösch/Einfügeoperationen ziemlich schlecht abzuschneiden, weil ein Vector stets darauf achten muß, daß das von ihm verwaltete Array Lückenlos ist. Dh in deinem Fall: brauchst du keinen RandonAccess, ists die falsche Wahl.

std::list ist bzgl. Einfüge/lösch Operationen nicht schlagbar, jedenfalls wenn es sich um große Listen handelt. Allerdings kannst Du die Elemente nur in sequentieller Folge ansprechen.

Finally, std::set ist bzgl Einfüge/löschoperationen langsamer als eine list, aber noch immer schneller als ein std::vector. Eine std::set bietet sich zB an, um sicher zustellen, daß keine Duplicate im Container enthalten sind.


Sind die verwalteteten Element *sehr* viele, kann es u.U. schon wieder vorteilhaft sein, einen Vektor zu verwenden und die Einfüge/Lösch operationen zu optimieren: denn wenn Du nur Pointer verwendest, ist bei std::set und std::list ist der Memoryoverhead gewaltig.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 19.03.2007 um 14:03 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.03.2007, 14:03 Uhr
Soto



Also die Funktion, die den Container bekommt, soll alle Elemente durchgehen und eventuell Elemente löschen. Gelöscht wird also meistens in der Mitte. Das spricht natürlich mehr für List.

Ich habe mir auch überlegt, einen Vector zu verwenden, und wenn eine Element gelöscht werden soll, dieses mit dem Element am Ende zu vertauschen und dann pop_back() zu machen...
--
ich versuche zu helfen, sorry wenn ich nen scheiß rede ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.03.2007, 14:14 Uhr
Kest
saint


Tja, aber wäre das mit dem Vector nicht zu umständlich ?
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.03.2007, 14:42 Uhr
Soto




Zitat von virtual:
[...]


Sind die verwalteteten Element *sehr* viele, kann es u.U. schon wieder vorteilhaft sein, einen Vektor zu verwenden und die Einfüge/Lösch operationen zu optimieren: denn wenn Du nur Pointer verwendest, ist bei std::set und std::list ist der Memoryoverhead gewaltig.


Es geht um bis zu 1 Million von Pointern, das wären dann "sehr" viele oder?
--
ich versuche zu helfen, sorry wenn ich nen scheiß rede ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.03.2007, 15:09 Uhr
0xdeadbeef
Gott
(Operator)


Der Overhead ändert sich nun nicht dadurch, ob Zeiger oder die Objekte direkt verwaltet werden, sondern mit der Zahl der Objekte. Ein Vektor ist hier, denke ich, denkbar ungeeignet, denn da wird das Löschen aus der Mitte ewig lange dauern. Es sei denn, man kopiert sich den Kram hin- und her, aber auch dann kriegt man Probleme, weil man vorher nicht weiß, wieviel Speicher man eigentlich braucht.

Prinzipiell bin ich der Ansicht, dass ein Programm, dass eine Million Objekte jongliert, ruhig mal 20 Megabyte Speicher verbrauchen darf. Allerdings stellt sich auch die Frage, ob es nicht sinnvoller wäre, den ganzen Kram in eine Datenbank auszulagern - aber das musst du schon selbst beantworten, du schreibst das Programm ja.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.03.2007, 16:55 Uhr
virtual
Sexiest Bit alive
(Operator)


Unter *sehr* groß würde ich etwas verstehen, wo der realespeicher nicht mehr ausreicht, die Daten zu halten. Wenn also Dein Programm einen Footprint bekommt, der regelmäßig zum swappen führt. Wie hoch diese Grenze ist, hängt von der Zielplattform ab.

Ich wollte auch lediglich daraufhinwiesen, daß zB eine std::list speziell bei einem double* neben den reinen Nutzdaten minimal nochmal die doppelte Menge an Speicher für zusätzliche Kontrollstrukturen benötigt; dies ist bei std::vector nicht notwendig.

Also angeommen ich hätte jetzt ganz viele Daten uns wollte unbed. vector verwenden, dann würde ich zusehen, daß ich beim Einfügen immer nur brav am Ende einfüge (und nett reserve verwende) und nicht entferne, sondern ungültige/entfernte ZTeiger einfach mit NULL überschreibe.

Da eine Datenbank mitunter einen gewaltigen Kommunikationsoverhead nach sich zieht und man ohnehin durch alle Elemente iteriert, wäre ein Datenbankansatz vermutlich auch nicht empfehlenswert, well man dann schonmal garantiert dreimal die gesamte Collection kopieren muß (in DB reinschreiben beim Erstellen, Auslesen in Funktion, Auslesen in Hauptfkt).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 19.03.2007 um 16:56 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: