std::map mit key std::string*



  • Wenn ich eine map mit string* als key habe, werden dann die pointeradressen miteinander verglichen? Wenn ja, wie bekomme ich es hin, dass die strings miteinander verglichen werden?



  • - Immer wenn du Typ* hast werden die Pointer-Adressen verglichen.
    - Warum verwendest du nicht einfach std::string? Fügst du derart oft in die Map ein, dass der Kopier-Vorgang dafür zu lange dauert?

    Die Lösung ist die Verwendung eines eigenen Comperators:

    template <class Type>
    struct PtrRefLess
    {
        bool operator() (Type lhs, Type rhs)
        {
            return(*lhs < *rhs);
    };
    
    typedef map<std::string*, value_type, PtrRefLess<std::string*> > MyMap;
    

    MfG SideWinder


  • Mod

    SideWinder schrieb:

    Fügst du derart oft in die Map ein, dass der Kopier-Vorgang dafür zu lange dauert?

    Was im Prinzip eine rhetorische Frage ist. Beim Einfügen selbst muss ja regelmäßig der String mehrfach verglichen werden, was dann auch ein O(N)-Problem ist. Übrigens sollte der Operator eine const-Funktion sein. Andernfalls wird es problematisch, wenn const-Funktionen der Map aufgerufen werden.



  • Hat er ziemlich unterschiedliche Strings beläuft sich das O(N)-Problem aber schnell auf nur ein bis zwei Vergleiche pro String. Das Kopieren dauert aber auf jeden Fall O(N).

    MfG SideWinder



  • Ja, dass mit dem Pointer wollte ich machen, damit nicht immer wieder kopiert wird. gibt es eigentlich auch sowas wie ähnliches die HashMap von Java?



  • xcvx<yvyx schrieb:

    Ja, dass mit dem Pointer wollte ich machen, damit nicht immer wieder kopiert wird. gibt es eigentlich auch sowas wie ähnliches die HashMap von Java?

    Ja. Viele Compiler habe es als hash_map oder so eingebaut.
    Im kommenden C++ -Standard (C++0x) ist es als unordered_map vorgesehen.
    Vom GNU C++ 4.2 Compiler wird unordered_map bereits unterstützt.



  • helpie schrieb:

    Vom GNU C++ 4.2 Compiler wird unordered_map bereits unterstützt.

    Sie ist ja auch bereits seit April 2006 (oder 2005?) Teil des Standards als 'std::tr1::unordered_map'.



  • Nein, nicht des Standards, sondern des Standardentwurfs.
    Die Verabschiedung des neuen C++ Standards wird noch etwas dauern.
    2009 wird jetzt definitiv angepeilt.
    Weitere Informationen findet man hier:
    http://www.open-std.org/jtc1/sc22/wg21/


Anmelden zum Antworten