Vertauschen von List-Elementen



  • Mit sort ist es nicht getan da ich nach einem bestimmten teil im element sortieren möchte!! Ich hab eine list<struct>, das heißt in dieser Struktur wo ich eingelesen hab möchte ich nach einem Element sortieren.

    Kann ich den Sort-Befehl irgendwo modifizieren??

    Gruß



  • Jap:

    bool isAbeforeB(const Struct& a, const Struct& b)
    {
        return a.element < b.element;
    }
    
    ...
    
    meineListe.sort(isABeforeB);
    

    Guck dir mal eine STL-Einführung an, fast alle Algorithmen lassen sich durch eigene Funktionen und Funktoren anpassen.



  • 1.) std::list<...> hat eine Member-Funktion swap. Warum funktioniert die dir
    nicht 😕

    2.) std::list<...> hat auch eine Member-Funktion sort. Definiere einfach einen
    < - Operator für deine struct und schon kannst du sie auch verwenden. 😉

    mfg JJ



  • Hab ich auch schon versucht aber bekomme dann einen Fehler

    F:\Michael\N7\Netzwerk\henne\Subprog\06_SortOrderList\Order.cpp(116) : error C2664: 'void __thiscall std::list<class COrder *,class std::allocator<class COrder *> >::sort(struct std::greater<class COrder *>)' : Konvertierung des Parameters 1 von 'bo
    ol (const class COrder &,const class COrder &)' in 'struct std::greater<class COrder *>' nicht moeglich
            Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig
    

    Ich habe den BOOL in der Header definiert. Die Sort funktion rufe ich in der CPP auf und dann bekomme ich diesen Fehler!!

    Ich dreh noch durch!!!



  • BOOL 😕 😕

    Keine Ahnung was du da gemachst hast. Aber eine Blick auf den Quellcode hilft
    manchmal weiter. 🙂

    mfg JJ



  • Also den operator hab ich in List.h

    List.h
    struct tOrder
    {
    	int		m_iOrderNr;		
    	int		m_iStartTime;
    	char	m_cStartPoint;
    	char	m_cStopPoint;
    	int		m_iRate;			//Datenmenge
    	char	m_cUnit;			//Datenmenge ( G M K )
    };
    
    bool Startpunkt(const tOrder& a, const tOrder& b) 
    {
    		return a.m_iStartTime < b.m_iStartTime;
    }
    

    Dann hab ich in einer anderen Klasse die Sortier Funktion

    List.cpp
    	for( itForward = Leli.begin(); itForward != --Leli.end() ;  )
    	{
    
    		iOrderFirst = (*itForward)->iStartTime;
    		printf("%i", iOrderFirst);
    		itForward++;
    		iOrderSecond = (*itForward)->iStartTime;
    		printf("%i", iOrderSecond);
    
    	}
    
    	Leli.sort(Startpunkt);
    

    Und wenn ich das so mach bekomme ich den Fehler



  • Wie schon gesagt. es gibt bereits ne sort()-Funktion in std::list. Du musst nur
    den Operator < deiner Struct überschreiben bzw. in deinem Fall überhaupt
    definieren. und schon geht das Ganze.

    mfg JJ



  • Sorry ich stehe gerade voll auf dem Schlauch kannst du mir da weiter helfen???

    Wäre dir da sehr dankbar



  • Reden wir überhaupt beide von einer std::list ????

    mfg JJ



  • Ja klar reden wir von einer list!!

    Aber ich weiß nicht warum ich diese Sort-Funktion mit meinem definierten Operator nicht verwenden kann?? Keine Ahnung.
    Wo meinst du das ich mir eine Funktion schreiben soll um sie dann in meinem Sort zu verwenden???

    Gruß Michel



  • #include <iostream>
    #include <list>
    using namespace std;
    
    typedef struct tOrder
    {
        int m_iOrderNr;       
        int m_iStartTime;
        char m_cStartPoint;
        char m_cStopPoint;
        int m_iRate;            
        char m_cUnit; 
    
    	// Es sollte natürlich ein Konstruktor
    	// zur Initialisierung definiert werden !!!
    
    	bool operator< (const struct tOrder& item) {
    		return m_iStartTime <  item.m_iStartTime;
    	}
    } TORDER;
    
    int main(void)
    {
    	list<TORDER> mylist;
    	TORDER mydata1;
    	mydata1.m_iStartTime = 10;
    	mylist.push_back(mydata1);
    	TORDER mydata2;
    	mydata2.m_iStartTime = 1;
    	mylist.push_back(mydata2);
    	TORDER mydata3;
    	mydata3.m_iStartTime = 7;
    	mylist.push_back(mydata3);
    	list<TORDER>::iterator it;
    
    	for (it = mylist.begin(); it != mylist.end(); it++)
    		cout << it->m_iStartTime << endl;
    
    	mylist.sort();
    
    	for (it = mylist.begin(); it != mylist.end(); it++)
    		cout << it->m_iStartTime << endl;
    
    	return 0;
    }
    

    mfg JJ



  • template<>
    bool std::greater<tOrder>::operator()(tOrder const& lhs,tOrder const& rhs) const
    {
         return lhs.m_iStartTime > rhs.m_iStartTime;
    }
    
    Leli.sort(std::greater<tOrder>());
    

Anmelden zum Antworten