std::map find()



  • Hallo,

    habe ein Problem mit find() in einer map.

    Folgendes konstrukt:

    typedef std::map<wxObject*, wxString> mymap;
    typedef mymap::value_type Wertepaar;
    mymap socket_user;
    std::map<wxObject*,wxString>::iterator iter;
    

    Nun möchte ich diese map durchsuchen.

    iter = socket_user.find(UserID); //Zeile 453
    if( iter != socket_user.end() ) {
         pUsers[i]->online=true;
    }
    else{
         pUsers[i]->online=false;
    }
    

    Das verursacht aber folgenden Fehler den ich nicht wirklich verstehe.

    C:\Dev-Cpp\GUI_Server\GUI_ServerFrm.cpp In member function void GUI_ServerFrm::OnTimer(wxTimerEvent&)': 453 C:\\Dev-Cpp\\GUI\_Server\\GUI\_ServerFrm.cpp no matching function for call tostd::map<wxObject*, wxString, std::less<wxObject*>, std::allocator<std::pair<wxObject* const, wxString> > >::find(wxString&)'
    note C:\Dev-Cpp\include\c++\3.4.2\bits\stl_map.h:498 candidates are: typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::find(const _Key&) [with _Key = wxObject*, _Tp = wxString, _Compare = std::less<wxObject*>, _Alloc = std::allocator<std::pair<wxObject* const, wxString> >]
    note C:\Dev-Cpp\include\c++\3.4.2\bits\stl_map.h:498 typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::const_iterator std::map<_Key, _Tp, _Compare, _Alloc>::find(const _Key&) const [with _Key = wxObject*, _Tp = wxString, _Compare = std::less<wxObject*>, _Alloc = std::allocator<std::pair<wxObject* const, wxString> >]
    C:\Dev-Cpp\GUI_Server\Makefile.win [Build Error] [GUI_ServerFrm.obj] Error 1

    Hoffe mir kann jemand weiterhelfen.

    Danke & Gruß



  • Die Syntax für Map ist map< Key, Wert >. Die Funktion find sucht nach einem Key. Scheinbar ist UserID aber vom Typ wxString, also der Wert in der Map.



  • Die map verwendet <, um ihre Schlüssel zu vergleichen, bei deinen wxObject*s bedeutet das einen Zeiger-Vergleich. Wenn du etwas anderes haben willst, mußt du einen passenden Vergleichs-Funktor schreiben und angeben.

    *genauer hinsieht* Aber wahrscheinlich hast du nur die Datentypen verwechselt und meintest eigentlich eine map<wxString,wxObject*> 😉 (der erste Template-Parameter von map<> ist der Schlüssel, der zweite der Wert)

    PS: dein if-else-Konstrukt kannst du auch kürzer schreiben:

    iter = socket_user.find(UserID);
    pUsers[i]->online=iter!=socket_user.end();
    


  • hmm. und nach dem wert kann ich nicht suchen? Nur nach dem Key!?

    Dann muss ich die wohl doch tauschen...

    Danke & Gruß



  • Mit der integrierten find()-Methode der map kannst du nur nach den Schlüsseln suchen. Wenn du unbedingt nach einem Wert suchen willst, kannst du die Algorithmen find() oder find_if() geeignet füttern.



  • Wenn du unbedingt nach einem Wert suchen willst, kannst du die Algorithmen find() oder find_if() geeignet füttern.

    Kannst du das ein bischen genauer erklären, ich kann nämlich doch nicht so einfach tauschen und müsste nach dem wert suchen(auch der wert ist max einmal in der gesamten map).

    meinst du das hier?
    http://cppreference.com/cppalgorithm/find.html



  • Der Algorithmus find_if() sucht in einem Iteratorbereich nach dem ersten Element, das eine vorgegebene Bedingung erfüllt. Also mußt du ihm nur die richtige Bedingung verraten:

    //Suchkriterium - als Functor wegen der besseren Konfigurierbarkeit
    struct finder : public unary_function<Wertepaar,bool>
    {
      finder(const wxString& name) : m_name(name) {}
    
      bool operator()(const Wertepaar& suchwert)
      { return suchwert.second==m_name; }
    private:
      const wxString& m_name;
    };
    
    ...
    iter = find_if(socket_user.begin(),socket_user.end(),finder(UserID));
    ...
    


  • Danke erstmal. Kann es sein das ich noch irgendein include fehlt? Habe noch nie etwas mit struct gemacht...oder was ist falsch!?
    Ich bekomme folgende Fehlermeldung

    234 C:\Dev-Cpp\GUI_Server\GUI_ServerFrm.h expected template-name before '<' token
    234 C:\Dev-Cpp\GUI_Server\GUI_ServerFrm.h expected `{' before '<' token
    234 C:\Dev-Cpp\GUI_Server\GUI_ServerFrm.h expected unqualified-id before '<' token

    struct finder : public unary_function<Wertepaar,bool> //Zeile 234
    

    wahrscheinlich eine dumme Frage, aber bin leider nicht so ein c++ pro.

    Danke & Gruß

    #include <functional>
    

    damit ändert sich auch nichts.

    hat sich erledigt. ein std:: vor unary_function hat bei mir gefehlt!



  • möglicherweise fehlt auch ein std:: an der Stelle.

    (wobei: in diesem Zusammenhang kannst du den Teil ab dem Doppelpunkt auch weglassen - ich hab's mir halt angewöhnt, Funktor-Klassen von unary- bzw. binary_function abzuleiten)



  • wie oben schon editiert. es hat das std:: gefehlt!
    Danke, funktioniert jetzt alles so wie ich mir das vorgestellt habe...


Log in to reply