std::map innerhalb einer std::map möglich?



  • Hallo,
    ist es möglich innerhalb einer std::map eine weitere std::map zu installieren?

    std::map<std::string, std::string> StringList;
    
    std::map<std::string, StringList> MsgMap;
    

    Im Prinzip hab ich einen Key nach dem ich Suchen möchte, der auch eindeutig ist; allerdings besitzt dieser Key auch ein bis fünf Subkeys.

    z.B. Key = Tasche --> Subkeys = Ledertasche, Stofftasche etc. Jeder Subkey besitzt natürlich noch einen entsprechenden Wert.

    Vielleicht gibt es auch interessante Alternativen. Die Anzahl der Subkeys ist unterschiedlich.

    <key1>
        <subkey1><value>
        <subkey2><value>
    <key2>
        <subkey1><value>
        <subkey2><value>
        <subkey3><value>
    <key3>
        <subkey1><value>
    

    Des Weiteren gleich noch eine zweite Frage: wenn ich nach dem Key suche, würde ich ja wenn es mit zwei std::maps geht, die "innere" std::map mit den Subkeys erhalten. Kann ich mich durch diese "Liste" entsprechend durchbewegen oder muss ich stets den richtigen Subkey aufrufen, um an den Wert zu kommen?

    Gruß
    Patrick



  • Ja, geht beides. Warum hast du es nicht einfach ausprobiert? - Eine map verschachteln geht genau gleich wie bei jedem anderen Typen auch und durch eine map iterieren geht auch. Das siehst du daran, dass es iteratoren dafür anbietet.

    Siehe hier:
    http://www.cplusplus.com/reference/stl/map/



  • drakon schrieb:

    Ja, geht beides. Warum hast du es nicht einfach ausprobiert? - Eine map verschachteln geht genau gleich wie bei jedem anderen Typen auch und durch eine map iterieren geht auch. Das siehst du daran, dass es iteratoren dafür anbietet.

    Siehe hier:
    http://www.cplusplus.com/reference/stl/map/

    Eine Frage ist dennoch geblieben - wie kann man bei einer Iteration den Endpoint setzen? So dass man eine std::map nur von A bis C durchsucht?

    std::map<CString, std::map<CString, CString>>::const_iterator itr2 = XmlNodes2.find(_T("Start"));  
    
    for(itr2 = XmlNodes2.begin(); itr2 != XmlNodes2.end(); ++itr2)
    {
    	CString substring =  (*itr2).first; 
    }
    
    <key1>
        <subkey1><value>
        <subkey2><value>
    <key2>
    

    In meinem Beispiel möchte ich z.B. nur die beiden Subkeys von key1 durchsuchen. Key1 entspricht dem "Start" von itr2.



  • Indem du dir einen Iterator auf dieses Element holst und dann nicht bist XmlNodes2.end() gehst, sondern eben bis zu diesem Iterator.

    btw:
    Schau dir mal typedefs an. Die machen das ganze einiges lesbarer.



  • drakon schrieb:

    Indem du dir einen Iterator auf dieses Element holst und dann nicht bist XmlNodes2.end() gehst, sondern eben bis zu diesem Iterator.

    btw:
    Schau dir mal typedefs an. Die machen das ganze einiges lesbarer.

    Danke für den Tipp mit den Typedefs. Leider hab ich es noch nicht ganz verstanden mit der for-Schleife#

    typedef std::map<CString, std::map<CString, CString>>::const_iterator iterator; 
    
    iterator itr2 = XmlNodes2.find(_T("Start"));  
    iterator itr3 = XmlNodes2.find(_T("End"));
    
    for(itr2; itr2 != itr3;  ++itr2)	
    {
    
       CString substring =  (*itr2).first; 
    }
    

    Auf welchen Wert muss ich itr2 in der for-Schleife zu Beginn setzen? Bis jetzt wird die for-Schleife nicht ausgeführt sondern einfach übersprungen.



  • hat irgendwie vorher nicht funktioniert; jetzt geht es...


Anmelden zum Antworten