std::sort und vector sortieren



  • 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);
    

    StrictWeakOrdering



  • 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.html

    Es 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. 😕


Anmelden zum Antworten