struct in map, wie zugriff und iterator?



  • Holla,

    ich habe ein struct und würde das gern in eine Map bringen, ich weiß allerdings nicht wie ich die map aufbauen kann oder wie ich dann den iterator drüber laufen lasse:

    struct myStruct {
        double a;
        int b;
        char c;
    };
    
    typedef std::map<myStruct, int> MyMap;
    
    //....in funktion...
    
    MyMap mm;
    
    //der Zugriff ab hier klappt net so
    struct myStruct ms;
    
    ms.a = 2.0;
    ms.b = 8;
    ms.c = 'c';
    
    mm[ms] = 3;
    
    //...iterieren über das map schaffe ich auch nicht...
    
    MyMap::iterator iter
    
     for(iter = mm.begin(); iter != mm.end(); iter++)
    {
         std::cout << (*iter).first << std::endl;    
    }
    

    leider kann mir weder sufu noch goole hier weiterhelfen.



  • Hallo.
    Zunächst einmal: "Geht nicht / Funktioniert nicht / Schaff ich nicht" sind keine ausreichende Fehlerbeschreibungen...

    Da eine map Schlüssel-Wert-Paare enthält, die nach den Schlüsseln sortiert sind, und da der Schlüssel-Typ in deinem Fall myStruct ist, braucht dieser natürlich auch einen Vergleichsoperator (vom "strict-weak-ordering"-Prinzip). Du musst deiner myStruct-Struktur also am besten einen operator< spendieren.



  • ich habe keine fehlerbeschreibung gepostet sondern um hilfe gebeten da mein Unwissen mich nicht weiterbringt. Wenn das in diesem Forum unerlaubt ist unterlasse ich das in Zukunft - ich habe gedacht solche foren sind unter anderem auch da um Hilfe zu bekommen wenn man nicht weiterkommt.

    Leider kann ich mit der Antwort so nichts anfangen - aber ich werde weiter googeln mit stichwörtern die in der antwort auftauchen -

    Danke



  • Naja, wenn du es kompilierst, dürfte er dir doch einige Fehlermeldungen ausspucken?! Die könntest du hier z.B. posten.

    zu deinem Problem:

    struct myStruct {
        double a;
        int b;
        char c;
    
        // Vergleichsoperator, damit die map sortiert werden kann
        bool operator<(const myStruct& rhs) const
        {
            return a < rhs.a;    // hier ggf. die Bedingung anpassen
        }
    };
    

    //edit: Einrückung angepasst...



  • Vielen Dank!

    Ich werde in Zukunft dann auch die Fehlermeldungen in meine Posts miteinbeziehen.
    Verstehe ich das jetzt richtig dass weil mein schlüsel in der map selbst definiert worden ist muss ich einen vergleichsoperator implementieren damit dann auch eine Ordnung definiert werden kann?

    ich versuche auch gleichzeitig einen iterator auf die map anzuwenden:

    MyMap::const_iterator iter;
        for(iter = m.begin(); iter != m.end(); iter++)
        {
            std::cout << (*iter).first << std::endl;    
        }
    

    die fehlermeldungen sind wie folgt:

    error: no match for 'operator<<' in 'std::cout << (&iter)->std::_Rb_tree_iterator<_Val, _Ref, _Ptr>::operator* [with _Val = std::pair<const Cell_Coords, int>, _Ref = const std::pair<const Cell_Coords, int>&, _Ptr = const std::pair<const Cell_Coords, int>*]()->std::pair<const Cell_Coords, int>::first'
    /usr/include/c++/3.3/bits/ostream.tcc:63: error: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:74: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>&(*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:86: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base&(*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:122: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:156: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:98: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/ostream:178: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/ostream:189: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/ostream:193: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/ostream:204: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:181: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:216: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:241: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/ostream:219: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:265: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:289: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/3.3/bits/ostream.tcc:313: error: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Trai
    

    ich dachte das evtl. jetzt auch der operator << definiert werden muss...habe es so versucht z.B.:

    string operator<<(const MyStruct& rhs) const
        {
            return "(" + rhs.a + "," + rhs.b + ")";   
        }
    

    Klappt wohl noch nicht so ganz....

    Danke für Hilfe



  • tschuldigung...
    string gibts natürlich net als solches...

    schaue gerade was möglich wäre.
    mit char kommt :

    error: invalid operands of types `const char*' and `const char[2]' to binary `operator+'
    


  • vani schrieb:

    Verstehe ich das jetzt richtig dass weil mein schlüsel in der map selbst definiert worden ist muss ich einen vergleichsoperator implementieren damit dann auch eine Ordnung definiert werden kann?

    Genau.

    vani schrieb:

    ich dachte das evtl. jetzt auch der operator << definiert werden muss...

    Das stimmt.
    Da der operator<< aber nicht auf deine Struktur myStruct angewandt wird, sondern auf ein std::ostream-Objekt (in deinem Fall cout), kannst du ihn nicht innerhalb deiner Struktur definieren.

    std::ostream& operator<<(std::ostream& out, const myStruct& rhs)
    {
        out << "(" << rhs.a << "," << rhs.b << ")";
        return out;
    }
    

    So müsste es gehen.
    Zur Operatoren-Überladung siehe auch hier und hier.



  • vielen dank nochmals.
    lerne wieder was dazu danke.

    leider beschwert er sich noch:

    std::ostream&MyStruct::operator<<(std::ostream&, const MyStruct&)' must take exactly one argument
    

    ich versuche mich weiter...



  • tschuldigung hab überlesen dass du geschrieben hast "darf es nicht in deiner struktur stehen".

    Außerhalb definiert gehts jetzt!

    Danke!



  • Hallo,

    meine map sieht so aus:

    struct Cell_Coords {
        int row;
        int col;
    
        bool operator<(const Cell_Coords& cc) const 
        { 
            if(row == cc.row)
                return col < cc.col;   
            return row < cc.row;
        } 
    };
    
    typedef std::map<Cell_Coords,int> MatrixMap;
    

    jetzt würde ich gern testen ob die map einen gewissen schlüssel besitzt.
    also sowas wie :

    if map.has_key(<2,3>) ...
    

    wie schaffe ich das wenn ich obige struktur als schlüsseltyp habe?

    Mein ansatz war folgender:

    struct Cell_Coords cc;
    cc.row = 0;
    cc.col = 0;
    int test = blur_operator[cc];
    std::cout << test << std::endl;
    

    aber so klappt es nicht mit der Meldung:

    error: passing `const MatrixMap' as `this' argument of `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = Cell_Coords, _Tp = int, _Compare = std::less<Cell_Coords>, _Alloc = std::allocator<std::pair<const Cell_Coords, in
    

    danke euch für Hilfe!!!



  • Hallo

    siehe map::find.

    bis bald
    akari


Anmelden zum Antworten