std::sort und vector sortieren
-
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.