std::sort und vector sortieren
-
Moin, ich hab schon msdn durchsucht, google gefragt, und Forensuche ist ja off
Also muss ich euch damit belästigen
*g*
Mein Problem, ich hab ne klasse, mit unterschiedlichen Membern, die
ich in nem Vector dann verwalte. Nun will ich den Vector mit std::sort sortieren.
funktioniert aber nicht ganz. (ich hab hier nur den Dev-C++, also ka ob es
evtl. auch am compiler liegt.)
Ich habe den op> überladen, sowie eine vergleichsfunktion geschrieben, wie es
in der MSDN steht, tut aber beides net.Jetzt meine Frage, wo finde ich ein funktionierendes Beispiel für das sortieren
eines Containers in der STL, bzw. welche ops muss ich überladen, damit
ein sort(vec.begin(),vec.end()) funktioniert?
-
ein
std::vector<std::string> data; //vector füllen std::sort(data.begin(),data.end());
sollte eigentlich funzen... jedenfalls bei mir gehts
-
Entweder
sort(vec.begin(),vec.end()); //sortiert die Werte mit op< //oder sort(vec.begin(),vec.end(), Cmp comp); //sortiert die Werte mit comp
-
fubar schrieb:
sort(vec.begin(),vec.end(), Cmp comp); //sortiert die Werte mit comp
du meinst wohl entweder
Cmp cmp; sort(vec.begin(),vec.end(), comp); //sortiert die Werte mit comp
oder
sort(vec.begin(),vec.end(), Cmp()); //sortiert die Werte mit comp
-
@Shade Of Mine:
Hab einfach die Schreibweise aus STL kurz & gut übernommen, mit comp ist natürlich die Vergleichsfunktion gemeint... Sorry.
-
Hm, also muss ich ne extra Compare Klasse erstellen, oder
ist Comp vom Typ der Vectorelemente ?Devil
-
afaik muss comp ein Prädikat sein - ein Funktionsobjekt das den op() überlädt und bool zurückgibt oder eine statische Funktion.
-
Hier steht es noch etwas ausführlicher beschrieben:
template <class RandomAccessIterator, class StrictWeakOrdering> void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp);
-
Soweit die Theorie
Ich hab jetzt mal ne testklasse zusammen gezimmert,
und auch ne Compare Klasse dazu.class data { int n; public: int Getn()const; public: friend bool operator<=(const data& lhs, const data& rhs); friend bool operator>=(const data& lhs, const data& rhs); data(int i); data(); virtual ~data(); data(const data& copy); data& operator=(const data& copy); friend bool operator<(const data &lhs, const data& rhs); friend bool operator>(const data &lhs, const data& rhs); friend ostream& operator<<(ostream& o, data& d); friend bool operator ==(const data &lhs,const data &rhs); friend bool operator !=(const data &lhs,const data &rhs); private: protected: }; class dataComparator { public: bool operator()(const data &lhs,const data &rhs)const { // cout << lhs.Getn() << "<" << rhs.Getn() << endl; return (lhs > rhs); } };
Und das Testprogramm:
int main(int argc, char* argv[]) { vector<data> dvec; for(int i=0; i <10; i++) dvec.push_back(data(rand()%10)); for(i=0; i <10; i++) cout << dvec[i] << " "; cout << endl; sort(dvec.begin(),dvec.end(),dataComparator()); for(i=0; i <10; i++) cout << dvec[i] << " "; return 0; }
Es läuft durch, (gibt also keinen fehler), allerdings bleibt die Menge unsortiert.
Devil
-
template<typename T> struct Comparator : std::binary_function <T, T, bool> { bool operator()(const T& lhs, const T& rhs) const { return (lhs > rhs); } };
Habs nicht getestet und weiß auch nicht, ob das so Sinn macht (wahrscheinlich eher nicht)!
Oder halt greater<T>, less<T>
-
Bringt auch nix, diese Version hab ich auch bereits getestet.
Bei google hab ich dies gefunden: http://www.roguewave.com/support/docs/sourcepro/stdlibref/sort.htmlEs funktioniert, kann mir aber nicht ganz erklären, warum es
dort funktioniert, und bei mir nicht.Devil
-
Das hilft dir jetzt zwar nicht wirklich, aber bei mir (gcc) funktioniert es auch... Könnte es evtl ein Problem des MSVC sein?
Edit: Auch die Comparator-Klasse!
-
Wieso nicht einfach:
bool compare_int(int&a,int&b){ return a<b; } //... vector<int>vec; //... sort(vec.begin(),vec.end(),compare_int);
-
fubar schrieb:
Das hilft dir jetzt zwar nicht wirklich, aber bei mir (gcc) funktioniert es auch... Könnte es evtl ein Problem des MSVC sein?
Edit: Auch die Comparator-Klasse!
beziehst du dich jetzt auf den Link, oder auf mein Beispiel ?
Devil
-
Eigentlich auf beides:
class dataComparator { public: bool operator()(const C& lhs,const C& rhs) const { return (lhs > rhs); } };
funktioniert und der Beispielcode von http://www.roguewave.com/support/docs/sourcepro/stdlibref/sort.html auch...
-
Das Beispiel aus dem Link funktioniert bei mir auch
Und irgendwie seh ich da kein Unterschied.Devil
-
devil81 schrieb:
Das Beispiel aus dem Link funktioniert bei mir auch
Ups, hatte folgenden Satz wohl falsch verstanden:
devil81 schrieb:
Es funktioniert, kann mir aber nicht ganz erklären, warum es
dort funktioniert, und bei mir nicht.