Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » std::vector von doppelten cleanen

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 < [ 2 ] [ 3 ]
000
20.05.2004, 03:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


angenommen ich habe einen std::vector<std::string>
wie stell ichs am geschicktesten an das die dopellten rausgeschmissen werden?
gibts dafür ne fertige funktion? unique schmeisst ja nur die die direkt hintereinander aufgeführten doppelten raus... wie macht man das am besten wenn man alle doppelten rausschmeissen will...

codeexamples appreciated
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.05.2004, 03:24 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hinbekommen hab ichs irgendwie so

C++:
std::vector<std::string> data;
//vector füllen
std::sort(data.begin(),data.end());
data.erase(std::unique(data.begin(),data.end()),data.end());



erste frage... ist das überhaupt richtig so oder hat das nur zufällig gefunzt. Benuzte algorithm das erste mal

2.Frage bleibt... gibts dafür nicht schon ne fertige funktion?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.05.2004, 08:12 Uhr
virtual
Sexiest Bit alive
(Operator)


Hi,

Du machst meiner Meinung nach alles richtig, dh so wie du es machst ist das vollkommen korrekt und es gibt keine vorgefertigte Funktion dafür.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.05.2004, 09:59 Uhr
(un)wissender
Niveauwart


@Windalf
Das ist so elegant, könnte glatt von mir sein.
Weiter so, und du kommst noch von *i=*j++**n++ weg.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.05.2004, 12:25 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


naja was ich mich am ehsten gefragt habe ist ob das vom aufwand optimal ist...
also wenn ich damit richtig grosse datenmengen (so mindestens in den 100000er) damit bewege

oder ob man lieber beim einfügen schon drauf achtet das es keine doppelte gibt... was wäre mit einer std::list... wäre das vom aufwand besser als einen std::vector zu nehmen?


Bearbeitung:

Das ist so elegant, könnte glatt von mir sein


Na das freut mich aber das mein erster Versuch nicht gleich ein Griff ins Klo war... Vielleicht werd ich die algorithm mal öfter benutzen...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 20.05.2004 um 12:30 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.05.2004, 15:49 Uhr
~Marco
Gast


Hi,

wenn du eine std::set nimmst, dann wird beim Einfügen automatisch schon darauf geachtet, dass keine doppelten Einträge vorkommen.

mfg

Marco
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.05.2004, 16:11 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Marco
hört sich gut an das werd ich glaub ich nehmen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.05.2004, 09:57 Uhr
typecast
aka loddab
(Operator)


Also vom aufwand her ist deine Methode leider sehr schlecht. Löschen aus einem std::vector ist normalerweise sehr teuer :-(

Wenn ich mich richtig an Info I errinnere, dann achten die meisten Kompiler darauf, dass die Elemente des Vectors immer hintereinander im Speicher stehen (ist afaik nicht vom Standard vorgeschrieben, aber gängige Praxis).

Das heißt, dass wenn du ein Element das sehr weit vorne steht löschst, muss der ganze Rest des Vektors verschoben werden.

Wenn du also viel löschen musst, dann solltest du über den Einsatz einer std::list nachdenken. Bei dieser gibt es afaik dieses Problem nicht.

Ist das nicht möglich, dann solltest du vor dem einfügen in den Vector überprüfen, ob das Element schon vorhanden ist.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.05.2004, 10:07 Uhr
(un)wissender
Niveauwart


1. Windalfs Methode dürfte in der Tat die performanteste sein, da bei set/list oder ähnlich Containern der Aufbau recht teuer ist.
Wenn man also die Aktion nur einmal machen will ist vector viel besser.

2.Vom standard her ist es vorgeschrieben, das in einem Vector die Elemente wie in einem Array angeordnert sind.

btw. Es ist gut möglich, dass der Vector ein zweites internes Array hat, um Sachen hin- bzw. her zu kopieren, und somit muss die Aktion auch nicht sooo langsam sein.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.05.2004, 13:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


äh jungs ich finds geil das ihr mir alle helfen wollt aber könnt ihr euch mal auf eins einigen

@virtual
sprich doch mal bitte ein Machtwort
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: