Iterator für std::map



  • hey,
    ich habe eine map angelegt und möchte nun darüber iterieren. ich habe folgenden code teil benutzt:

    typedef map<string,map<string,string>> adresses;
    adresses::const_iterator iter;
     for (iter=this->adressbook.begin(); iter != this->adressbook.end(); ++iter) 
     {
      cout<< iter->first <<"\n";
                    cout<<iter->second["name"];
    
     }
    

    Das Resultat von iter->first bekomme ich auch wie erwartet. allerdings kann ich nicht auf die zweite,"innerer" map zugreifen. mache ich beim zugriff irgendwas falsch? Das Feld ist in der map wirklich vorhanden, d.h. ich kann den wert ausgeben, wenn ich die map mit this->adressbook[test]["name"] anspreche.
    Mit der Ausgabe meines gcc's kann ich leider überhaupt nichts anfangen...
    mfg
    Mauser

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


  • Hallo,

    Du verwendest einen const_iterator. Daher ist auch die map, die im second drinsteckt const. Der op[] ist afaik so gebaut, daß er, wenn der entsprechende Eintrag noch nicht existiert diesen anlegt. Das geht aber nicht, wenn die map const ist. Du mußt also entweder auf das const verzichten, oder mit find arbeiten.

    MfG Jester



  • operator[] ist nicht const.

    btw:

    mauser schrieb:

    Das Feld ist in der map wirklich vorhanden, d.h. ich kann den wert ausgeben, wenn ich die map mit this->adressbook[test]["name"] anspreche.

    Das ist komplett richtig, denn falls es nicht vorhanden ist wird es beim Aufruf von op[] eingefügt. (mit value_type()) 😉



  • hi,

    danke für eure antworten, es lag natürlich am const. hatte leider net bedacht, dass der op[] auch automatisch elemente einfügt und das mit nem const net klappt.. alleine wär ich da wahrscheinlich net drauf gekommen 🙂
    mfg
    Mauser


Anmelden zum Antworten