warum castet er nicht?



  • folgendes:

    Ich habe einen Container, der Key-Value-Paare speichert. Dummerweise sortiert sich der anhand seiner Keys automatisch, was ich in diesem Fall nicht brauche

    Normalerweise würd ich dann als Key einfach einen vorlaufenden Index verwenden und aus dem Value ein Pair machen, aber das erfordert später wieder einen entsprechenden Aufwand das Pair wieder in Key und Value aufzusplitten

    Also dacht ich mir, mach ich eine Hilfsklasse, der ich meinen ursprünglichen Key und den Index mitgeb, nachdem der Container sortieren darf...

    Naja... ein bisschen Code wär wohl besser...

    also: folgendes war der erste Versuch

    myMap<myString, myString> content;
    
    content.insert( "z", "Z" );
    content.insert( "y", "Y" );
    content.insert( "x", "X" );
    
    std::cout << static_cast<myList<myString> >( content.keys() ).join( "," ) << std::endl // keys() gibt mir alle keys zurück, die ich später weiterverarbeite
    

    hat leider sortiert, was ich ja nicht wollte

    also hab ich mir folgende Hilfsklasse gebaut

    class UnsortableString
    {
    public:
        UnsortableString( int c, const myString& content ) : _c( c ), _content( content ) {}
        UnsortableString() : _c( 0 ), _content( "" ) {}
    
        int c() const { return _c; }
        myString content() const { return _content; }
    
        operator myString() const { return _content; }
    
    private:
        int _c;
        myString _content;
    };
    
    inline bool operator<( const UnsortableString& lhs, const UnsortableString& rhs )
    {
        return lhs.c() < rhs.c();
    }
    

    folgendes kompiliert, sortiert aber wieder

    myMap<myString, myString> content;
    int c = 0;
    
    content.insert( UnsortableString( c++, "z" ), "Z" );
    content.insert( UnsortableString( c++, "y" ), "Y" );
    content.insert( UnsortableString( c++, "x" ), "X" );
    
    std::cout << static_cast<myList<myString> >( content.keys() ).join( "," ) << std::endl
    

    foldenges kompiliert nicht einmal

    myMap<UnsortableString, myString> content;
    int c = 0;
    
    content.insert( UnsortableString( c++, "z" ), "Z" );
    content.insert( UnsortableString( c++, "y" ), "Y" );
    content.insert( UnsortableString( c++, "x" ), "X" );
    
    std::cout << static_cast<myList<myString> >( content.keys() ).join( ", " ) << std::endl
    

    mit der Meldung, dass er myList<myString> erwartet, aber myList<UnsortableString> bekommen hat... aber genau dafür hab ich ja operator myString() eingebaut -.-

    wie lös ich das, ohne gleich einen container dafür schreiben zu müssen?



  • vielleicht wärs einfacher wenn du erklärst was du eigentlich machen willst
    dein code sieht nach nem umständlichen workaround aus



  • std::map ist immer sortiert, weswegen auch der operator < für den Key verfügbar sein muss.



  • Sovok schrieb:

    vielleicht waers einfacher wenn du erklaerst was du eigentlich machen willst
    dein code sieht nach nem umstaendlichen workaround aus

    Die Elemente so wieder aus der Map bekommen, wie ich sie reingetan habe und zwar ohne den Key aendern zu muessen

    Ich nutze die map um die Felder zu speichern, die ich aus einer Datenbank laden will. Der Key ist der Name des Feldes, der value der Wert, der in meiner Anwendung statt des Feldnamens angezeigt werden soll. Da mir die Map die nette Funktion bietet, alle Keys in einer Liste zurueckgeben zu lassen, die ich ueber ein join() direkt in den DB-Query einbauen kann, wollte ich auf den "Komfort" nicht verzichten

    Ich habs jetzt aber anders geloest. Der Key ist nun ein Index, der Value ein pair. Musste nur noch ne Funktion schreiben, die mir die Liste an pairs entsprechend joinen kann

    jencas schrieb:

    std::map ist immer sortiert, weswegen auch der operator < fuer den Key verfuegbar sein muss.

    und? Den Operator hab ich implementiert, also was willst du mir sagen?



  • Um das mal zusammenzufassen was ich deinen Ausführungen bisher entnehmen konnte:

    Du willst key-value-Paare in einen Container stopfen und zwar so, dass du möglichst sowohl eine Suche/Sortierung über den Key als auch eine Suche/Sortierung über die input-Reihenfolge machen kannst.

    Vielleicht helfen dir die boost::multi_index_container da weiter.


Anmelden zum Antworten