Kurzfrage: schneller stl container direkt zu befüllen oder über objekt?
-
Hallo,
ich habe eine Klasse (z.B C1).
dort will ich einen stl-container befüllen (sehr oft hintereinander).
Nun mache ich mit diesem container viele sachen und überlege eine eigene klasse dafür zu schreiben und dann aus C1 auch den container dann eben über ein Objekt der neuen klasse zu befüllen etc...
Frage: Macht das von der geschwindigkeit unterschiede? Ich will möglichst zeitperformant bleiben...Sinn wäre eigentlich nur Übersicht und falls wo anders noch verwendung dann einfachere Verwendung der neuen Klasse...
Danke
-
würde deine klasse performance-bringende eigenschaften haben, die der stl-container nicht hat?
es wäre zum beispiel so, daß wenn deine container arrays wären, die immer 5 elemente hätten, daß dann std::vector mit seinem new und delete innendrin dagegen echt alt aussehen würde.
andererseits, wenn du arrays hättest, die auch wachsen können sollen, wäre std::vector eine prima wahl. da besteht eigentlich keine realistische chance, das selber schneller hinzukriegen.Sinn wäre eigentlich nur Übersicht und falls wo anders noch verwendung dann einfachere Verwendung der neuen Klasse...
äh, übersicht ist was ganz tolles. wenns der übersicht dient, dann mach es. da sind performance-überlegungen in c++ irrelevant, weil es doch immer wieder einen trick gibt, die übersichtliche version genauso perfomant zu bauen, wie die andere.
denk auch dran, daß man meistens ungefährt so kombiniert (falls du nicht eh schon genau das vorhattest):
class Weinliste{ std::map<Wein,int> bestand; public: void aufnehmen(Wein wein,int anzahl){ assert(anzahl>0); weine[wein]+=anzahl; } double berechneWarenbestand(){ ... } ... };also man baut sich ne klasse, die innendrin den standard-container benutzut und eigentlich gar nix anderes ist. nur will man in seiner anwendung lieber von Weinliste als von std::map<Wein,int> reden. außerdem will man ne aufnehmen-methode haben, statt auf dem container selber arbeiten zu müssen. also eigentlich nur schnickschnack, unwichtige vereinfachung (für viele programmierer sogar verkomplizierung!), die nix zu bringen scheint. bei größeren projekten wirds aber dann immer praktischer, wenn man sich damit eine problembezogene sprache schafft und dazwischenschaltet. außerdem erlaubt es, kleine nettigkeiten wie das assert einzubauen und sowas wie berechneWarenbestand(). außerdem optimiert der compiler diese dummen wrapper dann weg und du hast in c++ null zusatzkosten für abstraktion zu zahlen.
-
Guck dir doch einfach die verschiedenen STL Teile die es gibt an, also vector, list, map, ...
Oder falls dein Compiler schon die Noch-Nicht-Standard Hash-Container (hash_map, hash_set) unterstützt dann die auch noch, was lookup angeht sind die nach einem vector das schnellste was es so gibt.Bzw. wenns portierbar sein soll und du Hash-Container verwenden willst wirf nen Blick auf Boost.MultiIndex. Mit ein wenig Überredung laufen die sogar noch mit MSVC6 und sind auch einigermassen schnell.
Du kannst ja trotzdem eine Kapselung mit einer eigenen Klasse machen, bloss würde ich in dieser Klasse (Implementierung) nicht unbedingt das Rad neu erfinden wenns nix bringt.
-
sehr schön - vielen Danke - ihr habt mal wieder genau meine Fragen beantwortet

herrlich