STL maps mit eigenem constructor in einer Klasse verwenden - wie?
-
Hi alle,
ich möchte in einer Klasse eine map<> als der STL verwenden. Bei den maps kann man als 3. Parameter ja einen Vergleichsoperator angeben. Das Problem ist, dass ich beim Vergleichen einen Parameter benötige, der dem Vergleichsoperator beim "Konstruieren" übergeben werden muss, die map ruft aber immer den Standardkonstruktor auf.
Vielleicht ein Beispiel, damit's klarer wird:
#include <stdio.h> #include <map> class Test { private: class cmp { private: public: long Ncomp; cmp() {Ncomp = 0;}; cmp(long n) {Ncomp = n;}; bool operator() (const char* s1, const char* s2) { return memcmp( s1, s2, Ncomp ) < 0; }; }; std::map<char*,int,cmp> sols; // sols verwendet jetzt den Standardkonstruktor cmp(). Wie sagt how to make it use e.g. cmp(5) instead? public: void AddString(char*); void ListStrings(void); }; void Test::AddString(char*s) { char*c; c = new char[10]; // don't be bothered by the fixed length, it's just an example :) memcpy(c,s,10); sols[c]++; } void Test::ListStrings(void) { std::map<char*,int,cmp>::iterator it; for (it = sols.begin(); it != sols.end(); it++) { printf("%s %d\n",it->first,it->second); } } int main() { Test t; t.AddString("123"); t.AddString("123"); t.AddString("234"); t.ListStrings(); return 0; }
-
Nachtrag: Wenn ich nach der Deklaration in einer Funktion ein Objekt instanziiere, wie z.B.
std::map<char*,int,cmp> sols2(5);dann kann ich da einen eigenen Konstruktor verwenden, aber das funktioniert natürlich (so) nicht in der Klassendeklaration.
Vielleicht gibt es ja eine ganz einfache Lösung??
Hab leider in keinem Forum und keiner Gruppe einen Eintrag gefunden, der genau auf das Problem passt.Hoffe, ihr könnt mir helfen,
mfg,
Alexander
-
Du kannst dem map-Ctor auch ein bestimmtes Exemplar deines Vergleichsfunktors mitgeben:
Test::Test() : sols(cmp(5)) {};(nutzt cmp(5) als Vergleichsfunktion)
Edit: Randfrage: Warum verwendest du kein std::string?
-
*freu* Es geht!
Ja, ich weiß, ich hätte Strings verwenden dürfen / können / sollen

Letztendlich wär das aber unbefriedigend, weil es ja nicht mein eigentliches Problem löst (nämlich die Parameterübergabe).
Aber so
Test::Test(long n) : sols(cmp(n)) {};ist's toll. Vielen Dank für die schnelle Hilfe!!! Ich glaub, ich meld mich hier mal an
