[c++] Prob bei Übung mit string

Maps arbeiten typischerweise auf RB-Trees. Damit hast Du eine Suchzeit von O=log n. Mit dem Vektor hast Du eine konstante Zeit. Und ein Vektor der Länge std::numeric_limits<unsigned char>::max ist optimal für diese Aufgabe (Beim Einfügen darf man nur nicht vergessen, dass char u.U. signed sein kann)

Ich finde nicht, dass die map ein unbekannter Container ist. Wer mit der STL arbeitet, kommt recht schnell in Berührung damit. (aus eigener Erfahrung)


Zum cast-Operator - die Dinger sind grundsätzlich böse ^^. Denn Seiteneffekte, die daraus entstehen sind absolut furchtbar und schon in einem mittelmäßig großen Projekt nicht mehr zu überschauen. Plötzlich wird dein Objekt vergleichbar mit anderen Sachen (da implizit gecastet wird) und nichts arbeitet mehr so wie erwartet.


Was ich unschön finde an Deinem Code ist, dass Du Algorithmus mit Container mit Ausgabe mischt. (Persönliche Meinung) Ich denke, ich hätte einen ostream_iterator oder sowas verwendet (schon eher unbekannt). Obwohl das allesamt ein wenig überzogen ist für das Problem :)
 
Zuletzt bearbeitet:
7H3 N4C3R schrieb:
Maps arbeiten typischerweise auf RB-Trees. Damit hast Du eine Suchzeit von O=log n. Mit dem Vektor hast Du eine konstante Zeit. Und ein Vektor der Länge std::numeric_limits<unsigned char>::max ist optimal für diese Aufgabe (Beim Einfügen darf man nur nicht vergessen, dass char u.U. signed sein kann)
Eine Hashmap hat im Normalfall auch konstanten Aufwand, und eine Map braucht weniger Speicher als ein Vektor. Da bei einem so simplen Programm die Laufzeit (und der Speicheraufwand natürlich auch) aber volkommen egal ist (insbesondere wenn's nur um O(log n) geht) habe ich einfach das genommen was schneller zu programmieren war...

7H3 N4C3R schrieb:
Zum cast-Operator - die Dinger sind grundsätzlich böse ^^. Denn Seiteneffekte, die daraus entstehen sind absolut furchtbar und schon in einem mittelmäßig großen Projekt nicht mehr zu überschauen. Plötzlich wird dein Objekt vergleichbar mit anderen Sachen (da implizit gecastet wird) und nichts arbeitet mehr so wie erwartet.
Na ein Glück, dass das kein mittelmäßig großes Programm ist ;)

7H3 N4C3R schrieb:
Was ich unschön finde an Deinem Code ist, dass Du Algorithmus mit Container mit Ausgabe mischt. (Persönliche Meinung) Ich denke, ich hätte einen ostream_iterator oder sowas verwendet (schon eher unbekannt). Obwohl das allesamt ein wenig überzogen ist für das Problem :)
Ich wollte es dann eben doch nicht zu sehr übertreiben... :)
 
Weniger Speicher als ein Vektor? Büdde? :) Ein Vektor braucht drei Zeiger + capacity*sizeof(T). Eine Map hat pro Eintrag mindestens noch einen Zeiger. Dazu werden die Werte dann aligned, während sie im Vektor hintereinander liegen.

Naja egal wie groß das Programm ist, schlechte Angewohnheiten kommen schnell. Und cast-operatoren sollte man auf jeden Fall vermeiden ^^ Es mag Anwendungen geben die sinnvoll sind (siehe cin.operator void*), aber 1. Grundsatz ist vermeiden. operator bool castet sich z.B. nach fast allem. Wenn Du dann zum Beispiel einen Vergleichsoperator schreibst und diesem aus Versehen einen falschen Parameter mitgibst, beschwert sich der Compiler tendenziell nicht, sondern wendet den bool-cast an (natürlich sofern zutreffend) und vergleicht dann. Das gibt das reinste Chaos. Deshalb, Finger weg davon *g*.
 
Hallo Raechaer,

den Argumenten bzgl. cast operatoren schliesse ich mich mal an. Die neigen dazu unübersichtlich zu werden.

Ich habe Deinen Code auch erst mal debugged um alles zu kapieren.

Aber trotzdem ist es ein schönes Beispiel wie man so was in C++ mit Templates umsetzen kann.

MfG

Arnd
 

Ähnliche Themen

Zurück
Oben