Maps



  • Hallo,

    ich möchte eine Map erstellen, allerdings nicht, dass der Key ein String ist und der Valuewert ein Integer, sondern dies mischen.
    So würde ich ja eine Map anlegen

    map<string, int> map_
    

    Ich möchte aber, dass Keys zahlen und Zeichen sein können, ebenso bei den Values.

    Jemand eine Idee?



  • #include <iostream>
    #include <string>
    #include <map>
    
    using namespace std;
    
    class SuperMap
    {
        private:
            map<string, int> mapStr;
            map<int, string> mapInt;
    
        public:
            int &operator[](const string &key)
            {
                return mapStr[key];
            }
    
            string &operator[](const int &key)
            {
                return this->mapInt[key];
            }
    };
    
    using namespace std;
    
    int main()
    {
        SuperMap map;
    
        map[0] = "Hallo";
        map["test"] = 1337;
    
        return 0;
    }
    


  • Ups, hab das ein bisschen zu flüchtig gemacht. Merk ich z. B. daran, dass ein mal this-> fehlt und der int unnötigerweise per Referenz übergeben wird. Das Prinzip sollte aber klar sein.



  • Ah, ich muss also für jeden Fall eine Map anlegen, dachte man kann es irgendwie "einfacher" gestalten.

    Danke



  • KeinNameMehrFrei schrieb:

    Ah, ich muss also für jeden Fall eine Map anlegen, dachte man kann es irgendwie "einfacher" gestalten.

    Danke

    Das ist nur eine Idee von mir. Glaube, dass es da von Boost was gibt, aber da du meintest, dass du es für int/string brauchst, dachte ich, dass diese Lösung genügt.



  • Brauch es auch nur für int und String.

    Ich hab 4 Fälle:
    <int, string>
    <string, int>
    <string, string>
    <int, int>

    Mit Boost möchte ich (noch) nicht arbeiten.



  • Du kannst natürlich auch Templates verwenden, sodass du es für beliebige Typen-Kombinationen verwenden kannst:

    #include <iostream>
    #include <string>
    #include <map>
    
    using namespace std;
    
    template <typename T, typename U>
    class SuperMap
    {
        private:
            map<T, U> mapT;
            map<U, T> mapU;
    
        public:
            U &operator[](const T &key)
            {
                return this->mapT[key];
            }
    
            T &operator[](U key)
            {
                return this->mapU[key];
            }
    };
    
    using namespace std;
    
    int main()
    {
        SuperMap<int, string> foo;
    
        foo["test"] = 0;
        foo[0] = "test";
    
        SuperMap<float, int> foo2;
    
        foo2[0.111f] = 1234;
        foo2[0] = 12.34f;
    
        return 0;
    }
    


  • Ah, das ist eine viel schönere Lösung, als 4 verschiedene Maps anzulegen,
    allerdings habe ich ein Problem beim anlegen einer neuen Map in der Main.

    Ich erzeuge eine mit

    MapDictionary<int, string> maptest;
    

    Dann sagt der Compiler aber, dass int und String unzulässige Typnamen sind?!



  • Allerdings findet er angeblich auch kein cin und cout.. Obwohl ich

    using namespace std;
    

    benutze..



  • Für std::cin/std::cout brauchst du den Header iostream. Für std::string brauchst du den Header string. Zeig doch mal deinen Code...



  • Mapper schrieb:

    Ups, hab das ein bisschen zu flüchtig gemacht. Merk ich z. B. daran, dass ein mal this-> fehlt und der int unnötigerweise per Referenz übergeben wird. Das Prinzip sollte aber klar sein.

    Da fehlt kein this-> (eins zuviel).
    Was der TE sucht, ist** boost::bimap **.



  • //header
    #ifndef Uebung9.3_h
    #define Uebung9.3_h
    
    #include <string>
    #include <map> 
    
    using namespace std;
    template <typname T, typname U>
    
    class MapDictionary {
    
    private:
            map<T, U> mapT;
            map<U, T> mapU;
    
    public:
            U &operator[](const T &key)
            {
                return this->mapT[key];
            }
    
            T &operator[](U key)
            {
                return this->mapU[key];
            }
    }
    
    #endif
    
    #include "Uebung9.3.h"
    
    using std::map;
    using std::cout;
    using std::string;
    using std::cin;
    using std::endl;
    //using namespace std;
    
    int main()
    {
    	MapDictionary<int, string> maptest;
    
    	maptest["eydu"] = 15487;
    	maptest[815] = "geheim";
    	maptest[10105588799] = 8234;
    	maptest["visa"] = "hallo";
    
    	string key;
    	/*cout << "Key = ";
    	cin >> key;
    
    	map <int, string>::iterator it;
    	it = maptest.find(key);
    
    	if (it != maptest.end())
    	{
    		cout << "Key: " << it->first << " Vaule: " << it->second << endl;
    	}*/
    }
    

    Hab den Rest extra auskommentiert, weil anscheinend die std::map Sachen auch nicht erkannt werden



  • Hacker schrieb:

    Mapper schrieb:

    Ups, hab das ein bisschen zu flüchtig gemacht. Merk ich z. B. daran, dass ein mal this-> fehlt und der int unnötigerweise per Referenz übergeben wird. Das Prinzip sollte aber klar sein.

    Da fehlt kein this-> (eins zuviel).

    Wo is da eins zu viel?

    Hacker schrieb:

    Was der TE sucht, ist** boost::bimap **.

    Nein, er will ja vorerst kein Boost:

    KeinNameMehrFrei schrieb:

    Mit Boost möchte ich (noch) nicht arbeiten.



  • booster schrieb:

    Nein, er will ja vorerst kein Boost:

    KeinNameMehrFrei schrieb:

    Mit Boost möchte ich (noch) nicht arbeiten.

    Glatt übersehen 😃
    this-> ist völlig unnötig, außer lokale Variablen haben den gleichen Identifier wie eine deiner Member.



  • Hacker schrieb:

    this-> ist völlig unnötig.

    Geschmackssacke.



  • feinschmecker schrieb:

    Hacker schrieb:

    this-> ist völlig unnötig.

    Geschmackssacke.

    Aber kein Muss. Deswegen ist die Aussage "da muss noch ein this-> hin" falsch.



  • Ob this oder nicht, das ist ja hier jetzt nicht das Problem 😃



  • Hacker schrieb:

    feinschmecker schrieb:

    Hacker schrieb:

    this-> ist völlig unnötig.

    Geschmackssacke.

    Aber kein Muss. Deswegen ist die Aussage "da muss noch ein this-> hin" falsch.

    Gegenteiliges hab ich auch nie behauptet. Ich hab nur gesagt, dass da ein "this->" fehlt, was ich auf meinen Beitrag bezogen hab, weil ich es ein mal hin geschrieben und beim anderen aus Versehen vergessen hab.



  • Gut gut, schon verstanden. Zurück zum Thema - oder besser gesagt zu seinem Code.



  • Schön 😃
    Der, falls es nicht bemerkt wurde, bereits gepostet wurde 😉



  • Jo, du inkludierst natürlich nicht <iostream> .
    Vergiss übrigens nicht, dass beide Maps in MapDictionary unabhängig von einander existieren.


Anmelden zum Antworten