std::set, Zeiger und Sortieren...
-
Hey!
Ich hätte gerne meine Zeigerelemente sortiert, doch wie?
class Drawable { int zOrder; public: Drawable(int _zOrder) : zOrder(_zOrder) { ; } ~Drawable() { ; } bool operator<(const Drawable& drawable) const { return zOrder < drawable.zOrder; } bool operator>(const Drawable& drawable) const { return zOrder > drawable.zOrder; } int GetZOrder() { return zOrder; } }; int main() { std::set<Drawable*> elements; elements.insert(new Drawable(3)); elements.insert(new Drawable(0)); elements.insert(new Drawable(5)); for(std::set<Drawable*>::iterator i = elements.begin(); i != elements.end(); ++i) cout << (**i).GetZOrder() << endl; }
Wenn ich Zeiger im set speichere, wird nicht sortiert.
Wie geht es trotzdem am einfachsten?Danke!
MfG
-
Es wird ja auch nur sortiert was im Set ist. Und im Set sind nur die Pointer, nicht die Elemente auf die diese zeigen. Also werden die Speicheradressen sortiert.
Sonst vector nehmen und sort aus algorithm und diesem eine Sortierfunktion mitgeben.
-
Indem Du Set einen eigenen Comparator mitgibst (idealerweise einen, der allgemein die dereferenzierten Zeiger vergleicht):
template< typename Pred > struct ptr_comp { bool operator()( typename Pred::first_argument_type const* lhs, typename Pred::second_argument_type const* rhs ) { return pred( *lhs, *rhs ); } private: Pred pred; }; std::set< Drawable*, ptr_comp< std::less< Drawable > > > elements;
EDIT: Typ T ersetzt...
-
So:
struct CompareDrawable { bool operator()(const Drawable* left, const Drawable* right) { return *left < *right; } }; //... std::set<Drawable*, CompareDrawable> elements;
-
set erlaubt es als zweites Template Argument einen Funktor für "kleiner als" mitzugeben.
-
Also nur mit eigenem Comparator... hm ok danke!
MfG
//EDIT:
Hab nur ich das Problem dass ständig das Cookie zerbröselt wird?
-
Um LordJaxoms Vorschlag mal etwas const-korrekter zu gestalten und den std::less-Default der Standardbibliothek nachzubilden hier ein etwas abgewandelter Vorschlag:
template<typename T, class Comp = std::less<T> > struct ptr_comp { bool operator()( T const* const lhs, T const* const rhs ) const { return comp( *lhs, *rhs ); } private: Comp comp; }; std::set< Drawable*, ptr_comp<Drawable> > elements;
cpp@loggedoff@loggedoff schrieb:
//EDIT:
Hab nur ich das Problem dass ständig das Cookie zerbröselt wird?Hast du evtl. Krümelmonster Version 1.4 Installiert? *scnr*