[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 ..


Anmelden zum Antworten