Maps



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



  • Ja, hatte es mit Map schon bemerkt..

    Danke, natürlich war es (mal wieder) iostream. 🙄



  • KeinNameMehrFrei schrieb:

    Brauch es auch nur für int und String.

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

    Jetzt würde mich dochmal die Aufgabenstellung interessieren.



  • Theoretisch würde ich sowas nehmen:

    template<typename key1T, typename key2T>
    struct bimap
    {
            typedef std::vector<std::pair<key1T, key2T>> array_type;
            array_type array;
    
            typename array_type::iterator find(key2T tof)
            {
                    typename array_type::iterator iter = array.begin();
                    for(;iter != array.end();++iter)
                            if(iter->second == tof)
                                    break;
    
                    return iter;
            }
    
            typename array_type::iterator find(key1T tof)
            {
                    typename array_type::iterator iter = array.begin();
                    for(;iter != array.end();++iter)
                            if(iter->first == tof)
                                    break;
    
                    return iter;
            }
    
            key1T& operator[](key2T a)
            {
                    typename array_type::iterator iter;
                    if((iter = find(a)) != array.end())
                            return iter->first;
    
                    array.push_back(std::make_pair(key1T(), a));
                    return array.back().first;
            }
            key2T& operator[](key1T a)
            {
                    typename array_type::iterator iter;
                    if((iter = find(a)) != array.end())
                            return iter->second;
    
                    array.push_back(std::make_pair(a, key2T()));
                    return array.back().second;
            }
    };
    

    Nur ist halt das Problem, dass es nicht reguläre Memberfunktionen wie in einer std::map gibt... ⚠
    ➡ 💡
    Aufgabe für heute gefunden!



  • .. und das es ziemlich langsamer pfusch ist.. 😉


Anmelden zum Antworten