[STL] Wörterbuch
-
Hi,
ich möchte mir ein Wörterbuch erstellen, mit dem ich Enumerationen in Strings und wieder zurückübertragen kann. Das Wörterbuch sollte dazu 2 statische überladenen Fkt. find() besitzen. Es besitzt ca. 20 einträge.
Meine Lösung sieht bisher so aus:
enum MyEnum { MY_NULL, MY_EINS, MY_ZWEI, MY_DREI, MY_ERROR }; class MyDictionary { public: typedef std::map<MyEnum, std::string> DictType; static std::string find(MyEnum e) { if (_dict.empty()) init(); return (*_dict.find(e)).second; } static MyEnum find(const std::string& str) { if (_dict.empty()) init(); DictType::iterator it = _dict.begin(); while (it != _dict.end()) { if ((*it).second == str) return (*it).first; ++it; } return MY_ERROR; } private: static DictType _dict; static void init() { _dict[MY_NULL] = "null"; _dict[MY_EINS] = "eins"; _dict[MY_ZWEI] = "zwei"; _dict[MY_DREI] = "drei"; } };Habt ihr Tipps oder Verbesserungsverschläge?
Grüße,
don_basto.
-
Für ein fest vorgegebenes Enum dürfte ein Array vöölig ausreichen: vom Wert zum String kommst du per Index-Zugriff, rückwärts über std::find().
Außerdem könntest du auf ein Problem stoßen, wenn du _dict.end() derefenzieren willst (z.B. bei
find(MY_ERROR)).Für einen allgemeineren Ansatz würde ich vermutlich in int's um"rechnen" - und der Klasse noch Funktionen zum Ergänzen/Löschen von Zuordnungen mitgeben. Und ich würde die Funktionen NICHT static setzen (das hätte den Vorteil, daß du mehrere verschiedene Wörterbücher nebeneinander verwenden kannst).
-
Danke soweit. Die find()-Methode der Map hab ich geändert. Einen Vektor mit Index als Enum funktioniert hier nicht, da die Enums nicht immer aufsteigende Werte haben.
// EDIT: Die Idee mit den ints wäre auch eine Möglichkeit, obwohl es schon schick ist, einen "eigenen" Typ für Rückgabewerte, etc. zu haben. Mal sehen ..