map nacch anderen kriterien sortieren



  • std::map<std::string,std::pair<UINT,CScale*> > Scales;
    

    ich möchte gerne die map nach dem UINT sortiert bzw. gruppiert haben. Geht das, oder muss ich das irgendwie anders lösen?



  • Du kannst der Map doch einen less-Templateparameter mit auf den weg geben:

    template <typename T1, typename T2>
    struct keyless : std::binary_function<std::pair<T1, T2> const&, std::pair<T1, T2> const&, bool> {
        bool operator ()(std::pair<T1, T2> const& a, std::pair<T1, T2> const& b) { return a.first < b.first; }
    };
    
    std::map<std::string, std::pair<UINT,CScale*>, keyless<UINT, CScale*> > Scales;
    


  • sehr abstrakt der Code;) allerding diese fehlermeldung:

    d:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\map(144): error C2664: 'bool keyless<T1,T2>::operator ()(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : cannot convert parameter 1 from 'const std::map<_Kty,_Ty,_Pr>::key_type' to 'const std::pair<_Ty1,_Ty2> &'
            with
            [
                T1=UINT,
                T2=CScale *,
                _Ty1=UINT,
                _Ty2=CScale *
            ]
            and
            [
                _Kty=std::string,
                _Ty=std::pair<UINT,CScale *>,
                _Pr=keyless<UINT,CScale *>
            ]
            and
            [
                _Ty1=UINT,
                _Ty2=CScale *
            ]
    

    liegst vll an meinen typedef?

    template <typename T1, typename T2> 
    struct keyless : std::binary_function<std::pair<T1, T2> const&, std::pair<T1, T2> const&, bool> { 
        bool operator ()(std::pair<T1, T2> const& a, std::pair<T1, T2> const& b) { return a.first < b.first; } 
    }; 
    
    typedef std::map<std::string, std::pair<UINT,CScale*>, keyless<UINT, CScale*> > Scales_t;
    


  • Sorry, ich habe nicht aufgepasst. Das klappt natürlich nicht.

    Eine Map kann *nur* nach ihrem Key-Typ sortiert werden. Darauf beruht das Konzept der map. Du hast vor, sie nach ihrem Wert zu sortieren – das kommt mir komisch vor. Wieso ist das UINT nicht Teil des Schlüssels, wenn Du danach sortieren möchtest?



  • genau konrad, das habe ich bezweifelt.. naja muss das nun etwas anderes lösen aber trozdem danke:) aber wenn ich mir dein template anschaue hab ich noch paar fragen:

    binary_function
    

    ist ja ne abstrakte basisklasse oder?

    hier struct keyless : std::binary_function....
    

    hier leitest du ja keyless von binary_function ab? kann man strukturen von klassen ableiten?

    3. müsste nach dem ":" kein public kommen oder so?



  • EDIT:

    ja das UINT ist nachträglich hinzugekommen, deswegen der konstrukt:

    du meinst würde ich es so machen:

    typedef std::map<std::pair<std::string,UINT>, CScale*> > Scales_t;
    

    könnte ich einaml nach UINT sortieren und nach std::String?

    naja ich will über den Key , also über den string auf die CScale pointer zugriefen können, allerding will ich die CScalepointer in einer funktion auch nach UINT sortiert iterieren



  • GutenMorgen schrieb:

    binary_function
    

    ist ja ne abstrakte basisklasse oder?

    Nein, sie ist nicht abstrakt. Es handelt sich dabei nur um einen kleinen Helper aus der Standardbibliothek, der einige 'typedef's vornimmt. Strenggenommen ist das im vorliegenden Fall auch total unnötig, aber ich finde, dadurch sieht man besser, wofür die Struktur da ist.

    hier struct keyless : std::binary_function....
    

    hier leitest du ja keyless von binary_function ab? kann man strukturen von klassen ableiten?

    Structs und Klassen sind in C++ quasi dasselbe. Die einzigen Unterschiede sind die unterschiedlichen Standard-Sichtbarkeitsbereiche der Members ('public' bei Structs, 'private' bei Klassen), und …

    3. müsste nach dem ":" kein public kommen oder so?

    Nein, auch das ist bei Structs der Standard, daher kann es hier ausgelassen werden.



  • struct und class ist im prinzip das gleiche, sie unterscheiden sich nur in den standardkontext der member. bei struct ist alles standardgemäß public bei class alles private.

    den gültigkeitsbereich hinter dem ableiten kann man weglassen, wenn man die standardvariante haben will. bei class sollte das wie auch bei den members private sein, was man eigentlich nur sehr selten will und bei struct sollte das public sein. hinschreiben sollte man es eigentlich trotzdem, aber notwendig ist es nicht.

    edit: ich bin zu langsam...



  • GutenMorgen schrieb:

    EDIT:

    ja das UINT ist nachträglich hinzugekommen, deswegen der konstrukt:

    du meinst würde ich es so machen:

    typedef std::map<std::pair<std::string,UINT>, CScale*> > Scales_t;
    

    könnte ich einaml nach UINT sortieren und nach std::String?

    naja ich will über den Key , also über den string auf die CScale pointer zugriefen können, allerding will ich die CScalepointer in einer funktion auch nach UINT sortiert iterieren

    Na ja, da willst Du quasi zwei unterschiedliche Dinge tun. Üblicherweise sollte man da versuchen, klar zwischen verschiedenen Aufgaben zu trennen (es sei denn, Performance ist hier ausschlaggebend). D.h. ich würde Dir raten, die 'map' erst mal mit dem String als Schlüssel zu belassen und für das sortierte Durchiterieren einen anderen Weg zu gehen, nämlich die Daten in einen Vektor zu kopieren und diesen zu sortieren.


Log in to reply