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 weiterverarbeitehat 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::endlfoldenges 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::endlmit der Meldung, dass er
myList<myString>erwartet, abermyList<UnsortableString>bekommen hat... aber genau dafür hab ich jaoperator 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 ausDie 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 verzichtenIch 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.